简介
<span style="font-size:18px;">ReadWriteLock(读写锁),为我们提供了在某些并发访问场景的操作更加高效,读写锁的目标就是可以同时多个线程并发执行读操作,写操作等待,当写操作获得执行时,所有其他线程的读操作和写操作都将等待。总结就是:读读不互斥,读写互斥,写写互斥,写读互斥。</span>
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockTest {
private Map<String, Object> cacheMap = new HashMap<String, Object>();
/**读写锁*/
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
/**
* 获取缓存数据
* @param key
* @param defaultValue
* @return
*/
public Object getData(String key,String defaultValue){
rwLock.readLock().lock();
Object result = null;
try {
if (cacheMap.get(key) == null) {//缓存没有数据
rwLock.readLock().unlock();
rwLock.writeLock().lock();
try{
if (cacheMap.get(key) == null) { //这里判断是因为当有多个写操作等待时,
//第一个写操作已经设置值后,其他两个写操作可以进入这段代码,
//但是没有必要再次进行写操作
cacheMap.put(key, defaultValue);
result = cacheMap.get(key);
}
}finally{
rwLock.writeLock().unlock();
}
rwLock.readLock().lock();
}else{//缓存有数据
result = cacheMap.get(key);
}
} finally {
rwLock.readLock().unlock();
}
return result;
}
}