读写锁主要用来解决读-读能共存,读-写不能共存,写-写不能共存的情况,它的使用场景主要是读写分离,比如自己实现一个缓存,在刷新缓存的时候就需要用到读写锁。下面撸上一段代码,简单实现以下。
/**
* @author Administrator
* @date 2019/3/3
*/
public class Cache {
static Map<String,String> map=new HashMap<String,String>();
static ReentrantReadWriteLock rwl=new ReentrantReadWriteLock();
static Lock r=rwl.readLock();
static Lock w=rwl.writeLock();
/**
* 获取key对应的value
* @param key
* @return
*/
public static final String get(String key){
r.lock();
try{
System.out.println("正在做读操作,key: "+key+"----开始");
String value=map.get(key);
System.out.println("正在做读操作,key: "+key+"----结束"+" value:"+value);
System.out.println();
return value;
}catch (Exception e){
return null;
}finally {
r.unlock();
}
}
/**
* 设置key对应的value,
* @param key
* @param value
* @return
*/
public static final void put(String key,String value){
w.lock();
try{
System.out.println("正在做写的操作,key:" + key + ",value:" + value + "----开始");
Thread.sleep(1000);
map.put(key, value);
System.out.println("正在做写的操作,key:" + key + ",value:" + value + "----结束");
System.out.println();
}catch (Exception e){
}finally {
w.unlock();
}
}
/**
* 清除所有的内容
*/
public static final void clear(){
w.lock();
try{
map.clear();
}finally {
w.unlock();
}
}
public static void main(String[] args){
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++){
Cache.put(i+" ",i+"");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++){
Cache.get(i+" ");
}
}
}).start();
}
}
结果:
正在做写的操作,key:0 ,value:0----开始
正在做写的操作,key:0 ,value:0----结束
正在做写的操作,key:1 ,value:1----开始
正在做写的操作,key:1 ,value:1----结束
正在做写的操作,key:2 ,value:2----开始
正在做写的操作,key:2 ,value:2----结束
正在做写的操作,key:3 ,value:3----开始
正在做写的操作,key:3 ,value:3----结束
正在做读操作,key: 0 ----开始
正在做读操作,key: 0 ----结束 value:0
正在做写的操作,key:4 ,value:4----开始
正在做写的操作,key:4 ,value:4----结束
正在做写的操作,key:5 ,value:5----开始
正在做写的操作,key:5 ,value:5----结束
正在做写的操作,key:6 ,value:6----开始
正在做写的操作,key:6 ,value:6----结束
正在做写的操作,key:7 ,value:7----开始
正在做写的操作,key:7 ,value:7----结束
正在做读操作,key: 1 ----开始
正在做读操作,key: 1 ----结束 value:1
正在做读操作,key: 2 ----开始
正在做读操作,key: 2 ----结束 value:2
正在做读操作,key: 3 ----开始
正在做读操作,key: 3 ----结束 value:3
正在做读操作,key: 4 ----开始
正在做读操作,key: 4 ----结束 value:4
正在做读操作,key: 5 ----开始
正在做读操作,key: 5 ----结束 value:5
正在做读操作,key: 6 ----开始
正在做读操作,key: 6 ----结束 value:6
正在做读操作,key: 7 ----开始
正在做读操作,key: 7 ----结束 value:7
正在做读操作,key: 8 ----开始
正在做读操作,key: 8 ----结束 value:null
正在做读操作,key: 9 ----开始
正在做读操作,key: 9 ----结束 value:null
正在做写的操作,key:8 ,value:8----开始
正在做写的操作,key:8 ,value:8----结束
正在做写的操作,key:9 ,value:9----开始
正在做写的操作,key:9 ,value:9----结束
Process finished with exit code 0