• 多线程(4)


    显示锁

      1定义:显示声明的锁,比如reentrantlock
    

    非显示锁sychronized

    公平锁,非公平锁

      1定义:这个是reentrantlock底层,默认为非公平锁,速度快
    

    读写锁

      1:reentrantlock的分为读写锁,口诀:读读共享,写写互斥,读写互斥
      2:应用场景:多读写少的场景
    

    阻塞与唤醒 Condition

      1:对于同一个lock,可以加上Condition进行等待唤醒控制
      2:比如生产者消费者问题:
    
    package cn.enjoyedu.ch4.rw;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.function.Consumer;
    
    public class Test1 {
    
    
        private static Lock lock = new ReentrantLock();
        private static Condition notEmpty = lock.newCondition();
        private static Condition notFull = lock.newCondition();
        private static volatile  int count = 0;
        public static void main(String[] args) {
            ExecutorService pool = Executors.newFixedThreadPool(6);
            pool.execute(new Gun(lock, notEmpty, notFull));
            pool.execute(new Bullet(lock, notEmpty, notFull));
        }
    
        public static class Gun implements Runnable {
            private Lock lock;
            private Condition notEmpty;
            private Condition notFull;
    
            public Gun(Lock lock, Condition notEmpty, Condition notFull) {
                this.lock = lock;
                this.notEmpty = notEmpty;
                this.notFull = notFull;
            }
    
            public void run() {
                while (true) {
                    lock.lock();
                    while (count == 0) {
                        try {
                            notEmpty.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("射击---biubiubiu");
                    count--;
                    notFull.signal();
                    lock.unlock();
                }
            }
        }
    
        public static class Bullet implements Runnable {
    
            private Lock lock;
            private Condition notEmpty;
            private Condition notFull;
    
            public Bullet(Lock lock, Condition notEmpty, Condition notFull) {
                this.lock = lock;
                this.notEmpty = notEmpty;
                this.notFull = notFull;
            }
    
            public void run() {
                while (true) {
                    lock.lock();
                    while (count >= 20) {
                        try {
                            notFull.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("压入子弹---铛铛");
                    count++;
                    notEmpty.signal();
                    lock.unlock();
                }
            }
        }
    }
    
  • 相关阅读:
    WPF程序设计 :第四章 按钮与其他控件(Buttons and Other Controls)
    C#参考 : 枚举类型
    C#3.0 新特性学习笔记(3):匿名类型
    F#语言2008年9月CTP版已经更新
    C#3.0 新特性学习笔记(1): 对象集合初始化器
    WPF程序设计基础:属性系统
    C#3.0 新特性学习笔记(2):var 隐式声明变量
    MSSql行列转换的Sql语法 详解与实例
    WPF程序设计 :第一章 应用程序和窗口(The Application and the Window)
    WPF程序设计 :第二章 基本画刷(Basic Brushes)
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/13139445.html
Copyright © 2020-2023  润新知