package com.demo.lock.writer.to.read;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
*
* 锁降级:是将写锁降级为读锁
* 即为:在获取到写锁后,接着又获取到读锁后,此时再释放写锁
*
* @author Administrator
*
*/
public class WriteToReadLockDemo {
private volatile boolean isUpdate;
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
private Map<String, Object> map = new HashMap<String, Object>();
private Lock rLock = rwLock.readLock();
private Lock wLock = rwLock.writeLock();
public void method() {
/*
* 不同线程之间,读写锁是互斥的,同一个线程锁是可重入的
* 为了当有线程获取了写锁时,其它线程想获取读锁,也会等待写锁释放时,才可以进行
* 其实质就是为了当有线程在修改isUpdate值时,此时不能去读取isUpdate值
*/
rLock.lock();
if (isUpdate) {//添加volatile:为了保证当前线程修改了 isUpdate值对其它线程是可见的,
rLock.unlock();//释放读锁
/*
* 步骤 1 2 3 即为锁降级
*/
wLock.lock();//获取写锁 1
map.put("xxx", "xxxx");
rLock.lock();//获取读锁(防止还没有将map设置的值取出--步骤4,又有其它线程获取到写锁,对map进行重新赋值) 2
wLock.unlock();//释放写锁 3
}
Object object = map.get("xxx");//4
System.out.println(object);
rLock.unlock();
}
}