package unsafe;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author klr
* @create 2020-07-27-15:48
*/
public class RWL {
public static void main(String[] args) {
// MyCache myCache = new MyCache();
MyCacheLock myCache = new MyCacheLock();
//写入
for (int i = 0; i < 5; i++) {
final int temp = i;
new Thread(()->{
myCache.put(temp+"",temp+"");
},String.valueOf(i)).start();
}
//读取
for (int i = 0; i < 5; i++) {
final int temp = i;
new Thread(()->{
myCache.get(temp+"");
},String.valueOf(i)).start();
}
}
}
//自定义缓存,不加锁时
class MyCache{
private volatile Map<String,Object> map = new HashMap<>();//保证可见性
//写
public void put(String s, Object o){
System.out.println(Thread.currentThread()+"开始写"+s);
map.put(s,o);
System.out.println(Thread.currentThread()+"写完");
}
//读
public void get(String s){
System.out.println(Thread.currentThread()+"读到"+map.get(s));
System.out.println(Thread.currentThread()+"读完");
}
}
//使用读写锁,更加细粒度的操作
class MyCacheLock{
private volatile Map<String,Object> map = new HashMap<>();//保证可见性
private ReadWriteLock lock = new ReentrantReadWriteLock();
//写入的时候只希望同时只有一个线程写
public void put(String s, Object o){
lock.writeLock().lock();
System.out.println(Thread.currentThread()+"开始写"+s);
map.put(s,o);
System.out.println(Thread.currentThread()+"写完");
lock.writeLock().unlock();
}
//读
public void get(String s){
lock.readLock().lock();
System.out.println(Thread.currentThread()+"读到"+map.get(s));
System.out.println(Thread.currentThread()+"读完");
lock.readLock().unlock();
}
}
网友评论