ReadWirteLock
使用场景:为了提高效率,将业务差分,精确加锁,提高效率
读写锁:ReadWriteLock lock=new ReentrantReadWriteLock();
获取读锁: Lock lock = this.lock.writeLock();
获取写锁: Lock lock = this.lock.readLock();
效果:读读共享,读写不共享,写写互斥
写锁:独占锁
读锁:共享锁
public class ReadWirteLockDemo {
public static void main(String[] args) {
MyCache myCache = new MyCache();
//读取
for (int i = 0; i < 5; i++) {
final int a=i;
new Thread(()->{
myCache.put(a+"",a+"");
},String.valueOf(a)).start();
}
//写入
for (int i = 0; i < 5; i++) {
final int a=i;
new Thread(()->{
myCache.get(a+"");
},String.valueOf(a)).start();
}
}
}
//自定义缓存
class MyCache {
private volatile Map<String, Object> map = new HashMap<>();
private ReadWriteLock lock=new ReentrantReadWriteLock();
//存 写
public void put(String key,Object value) {
Lock lock = this.lock.writeLock();
lock.lock();
System.out.println(Thread.currentThread().getName()+"写入"+key);
map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入完成");
lock.unlock();
}
//读 取
public void get(String key) {
Lock lock = this.lock.readLock();
lock.lock();
System.out.println(Thread.currentThread().getName()+"读取"+key);
Object o = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取完成");
lock.unlock();
}
}