java锁包读写锁_Java 同步和协作工具类(一):读写锁 ReentrantReadWriteLock

1. Java 并发包中专门的同步和协作工具类有哪些?

答:读写锁 RenentrantReadWriteLock。

信号量 Semaphore。

倒计时门栓 CountDownLatch。

循环栅栏 CyclicBarrier。

2. synchronized 和显示锁 ReentrantLock,对于同一受保护对象的访问,无论是读还是写,都要求获得相同的锁。在一些场景中,这是没有必要的,多个线程的读操作完全可以并行。在读多写少的场景中,让读操作并行可以明显提高性能,怎么让读操作能够并行,又不影响一致性呢?

答:使用读写锁。

3. 怎样理解读写锁?

答:在 Java 并发包中,接口 ReadWriteLock 表示读写锁,主要实现类是可重入读写锁 ReentrantReadWriteLock。

ReadWriteLock 的定义为:public interface ReadWriteLock {

Lock readLock();

Lock writeLock();

}通过一个 ReadWriteLock 产生两个锁:一个读锁,一个写锁。

读操作使用读锁,写操作使用写锁。

只有“读-读”操作是可以并行的,“读-写”和“写-写”都不可以。

只有一个线程可以进行写操作,在获取写锁时,只有没有任何线程持有任何锁才可以获取到。

在持有写锁时,其他任何线程都获取不到任何锁。

在没有其他线程持有写锁的情况下,多个线程可以获取和持有读锁。

ReentrantReadWriteLock 是可重入的读写锁,构造方法中的参数 fair 表示是否公平,如果不传递则是 false。公平的意思是:等待时间最长的线程优先获得锁。保证公平会影响性能,一般也不需要,所以默认不保证公平,synchronized 锁也是不保证公平的。

4. 【笔试题】使用读写锁实现一个缓存类 MyCache?

答:public class MyCache {

private Map map = new HashMap<> ();

private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

private Lock readLock = readWriteLock.readLock();

private Lock writeLock = readWriteLock.writeLock();

public Object get(String key) {

readLock.lock();

try {

return map.get(key);

} finally {

readLock.unlock();

}

}

public Object put(String key, Object value) {

writeLock.lock();

try {

return map.put(key, value);

} finally {

writeLock.unlock();

}

}

public void clear() {

writeLock.lock();

try {

map.clear();

} finally {

writeLock.unlock();

}

}

}

5. 读写锁是怎么实现的?读锁和写锁看上去是两个锁,它们是怎么协调的?

答:源码具体实现比较复杂,这里简述下其思路:内部,它们使用同一个整数变量表示锁的状态,16 位给读锁用,16 位给写锁用。使用一个变量便于进行 CAS 操作,锁的等待队列其实也只有一个。

写锁的获取,就是确保当前没有其他线程持有任何锁,否则就等待。写锁释放后,也就是将等待队列中的第一个线程唤醒,唤醒的可能是等待读锁的,也可能是等待写锁的。

读锁的获取不太一样,首先,只要写锁没有被持有,就可以获取到读锁。此外,在获取到读锁后,它会检查等待队列,逐个唤醒最前面的等待读锁的线程,直到第一个等待写锁的线程。如果有其他线程持有写锁,获取读锁会等待。读锁释放后,检查读锁和写锁数是否都变为了 0,如果是,唤醒等待队列中的下一个线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值