java多线程(4)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011747152/article/details/80371888

ReentrantLock

  1. ReentrantLock 是重入锁的意思,实现了Lock接口
  2. ReentrantLock 可以实现线程间的同步,用Condition实现线程间的通信, synchronized 与 wait() 方法和 notify() 方式结合实现线程间通信的时候,notify/notifyAll 的通知等待的线程时是随机的,而condition可以实现选择性通知
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class LockConditionDemo {

    private Lock lock = new ReentrantLock();
    private Condition conditionA = lock.newCondition();
    private Condition conditionB = lock.newCondition();

    public static void main(String[] args) throws InterruptedException {

        LockConditionDemo demo = new LockConditionDemo();

        new Thread(() -> demo.await(demo.conditionA), "thread1_conditionA").start();
        new Thread(() -> demo.await(demo.conditionB), "thread2_conditionB").start();
        new Thread(() -> demo.signal(demo.conditionB), "thread3_conditionB").start();
        System.out.println("稍等5秒再通知其他的线程!");
        Thread.sleep(5000);
        new Thread(() -> demo.signal(demo.conditionA), "thread4_conditionA").start();

    }

    private void await(Condition condition) {
        try {
            lock.lock();
            System.out.println("开始等待await! ThreadName:" + Thread.currentThread().getName());
            condition.await();
            System.out.println("等待await结束! ThreadName:" + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    private void signal(Condition condition) {
        lock.lock();
        System.out.println("发送通知signal! ThreadName:" + Thread.currentThread().getName());
        condition.signal();
        lock.unlock();
    }
}

如上的例子,先通知conditionB,再通知conditionA

3.公平锁和非公平锁:公平锁:先进先出。非公平锁:随机获得锁。
ReentrantLock 提供了一个构造方法,可以很简单的实现公平锁或非公平锁
4.ReentrantReadWriteLock
ReentrantReadWriteLock 有两个锁:一个是与读相关的锁,称为“共享锁”;另一个是与写相关的锁,称为“排它锁”
读读共享;
写写互斥;
读写互斥;
写读互斥

猜你喜欢

转载自blog.csdn.net/u011747152/article/details/80371888