1.读写锁ReentrantReadWriteLock的原理 解决线程安全问题使用ReentrantLock就可以了,但是ReentrantLock是独占锁,某一时刻只有一个线程可以获取该锁,而实际中会有写少读多的场景,显然ReentrantLock满足不了这个需求,所以ReentrantReadWriteLock应运而生。ReentrantReadWriteLock采用读写分离的策略,允许多个线程可以同时获取读锁。
缓存的数据保存在Cache类内部的HashMap里面,HashMap不是线程安全的,这里我们使用读写锁ReadWriteLock 来保证其线程安全。ReadWriteLock 是一个接口,它的实现类是ReentrantReadWriteLock,通过名字你应该就能判断出来,它是支持可重入的。下面我们通过rwl创建了一把读锁和一把写锁。 Cache这个工具类,我们提供了两个方法,...
相对ReentrantLock来说,ReadWriteLock是比较省资源的,ReentrantLock虽然也可以保证线程安全,但是比较耗资源的,比如在所有线程都是读锁的情况,这种情况就是线程安全的,就不需要做线程安全控制,直接保证线程并行执行就行,但是ReentrantLock不能做到,所以ReadWriteLock根据一系列规则保证了线程安全也保证了执行效率。
publicvoidupdateCache(Stringkey,ObjectnewValue){lock.readLock().lock();try{ObjectcurrentValue=cache.get(key);if(newValue.equals(currentValue)){return;}lock.readLock().unlock();lock.writeLock().lock();try{// 再次检查以确保数据的最新性,因为这期间其他线程可能已经修改了该值if(!newValue.equals...
ReadWriteLock是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁。 读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的(排他的)。 每次只能有一个写线程,但是可以有多个线程并发地读数据。 所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁...
读写锁(ReadWriteLock)包含如下两个方法: 1.读锁 Lock readLock() 2.写锁 Lock writeLock() Example 以下代码在开始读数据的时候上读锁,当有一个线程发现没有数据时,释放读锁,上写锁,开始写入数据。 数据写入完成后释放写锁,并还原成读锁,实现了简单的读和写之间的互斥。
ReadWriteLock更简单直观,适用于读写操作相对均衡的场景。 适用场景: 如果读操作频繁而写操作较少,且对读操作的并发性能要求较高,可以考虑使用StampedLock。 如果读写操作相对均衡,或者更倾向于简单的实现,可以使用ReadWriteLock。 在选择使用ReadWriteLock还是StampedLock时,要根据具体的应用场景和性能需求来进行权衡。
ReadWriteLock 读写锁可以实现多个线程同时读取共享数据,即读读共享,可以提高程序的读取数据的效率。 package com.szh.lock.readwrite; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; ...
写锁(Write Lock):排他锁,仅一个线程可持有,且持有写锁的线程会阻塞其他所有读/写锁请求。 锁降级:持有写锁的线程可主动降级为读锁,减少资源竞争。 Java实现类: importjava.util.concurrent.locks.ReentrantReadWriteLock; 二、基础使用示例 场景:缓存系统(高频读取,低频更新) ...
* Returns the lock used for writing. */ Lock writeLock(); } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 其实现类如下: ⑤ 使用示例 实例代码如下: public class TestReadWriteLock { public static void main(String[] args){ ReadWriteLockDemo rwd = new ReadWriteLockDemo(); ...