版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011747152/article/details/80371888
ReentrantLock
- ReentrantLock 是重入锁的意思,实现了Lock接口
- 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 有两个锁:一个是与读相关的锁,称为“共享锁”;另一个是与写相关的锁,称为“排它锁”
读读共享;
写写互斥;
读写互斥;
写读互斥