一 概述
juc-locks框架指的是java.util.concurrent.locks包,简称锁juc-locks锁框架,包含三个接口,Lock接口,Condition接口,ReadWriteLock接口
二 Lock接口
-
Lock接口可以视为synchronized的增强版,提供了更灵活的功能。该接口提供了限时锁等待,锁中断,锁尝试的功能。
-
接口定义
-
lock()和lockInterruptibly()方法的区别:
lock()方法类似于synchronized加锁,如果锁不可用,出于线程调度的目的,当禁用当前线程,获得锁之前,一直是处于休眠状态。
lockInterruptibly(),如果锁不可用,当前的线程是可以被中断的,相对于synchronized更灵活。 -
使用示例:
可以看到,Lock作为一种同步器,一般会用一个finally语句块确保锁最终会释放。Lock lock = ...; if (lock.tryLock()) { try { // manipulate protected state } finally { lock.unlock(); } } else { // perform alternative actions }
三 Condition接口
-
Condition可以看成Object类对象的wait(),notify(),notifyAll()方法的替代,与lock配合使用。
当线程执行完condition的await()方法,当前线程会立即释放锁,并进入对象的等待区,等待其他线程唤醒或中断。
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length) //防止虚假唤醒,Condition的await调用一般会放在一个循环判断中
notFull.await();
items[putptr] = x;
if (++putptr == items.length)
putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length)
takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
四 ReadWritelock
- ReadWriteLock是个单独的接口,提供读锁和写锁;读锁是多个线程共同持有,写锁只能由一个线程持有。
- 读写锁适用情况
高频次的读操作,低频次的写操作
读的时间较长