多线程(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();
            }
        }
    }
}
posted @ 2020-06-16 10:02  小傻孩丶儿  阅读(115)  评论(0编辑  收藏  举报