/**
* 独占锁(写锁):一次只能被一个线程占用
* 共享锁(读锁):多个线程可以同时占有
* ReadWriteLock 是接口 ReentrantReadWriteLock是他的一个实现类
* 读-读: 可以共享
* 读-写: 不可共享
* 写-写: 不可共享
*/
public class Test1 {
public static void main(String[] args) {
// Cache cache = new Cache();
CacheLock cache = new CacheLock();
for (int i = 1; i < 6; i++) {
int temp = i;
new Thread(()->{
cache.write(temp+"", temp+"");
}, String.valueOf(temp)).start();
}
for (int i = 1; i < 6; i++) {
int temp = i;
new Thread(()->{
cache.read(temp+"");
}, String.valueOf(temp)).start();
}
}
}
/*
有锁的缓存
当一个线程写入时其他线程需要等他写入完成之后才能写入
*/
class CacheLock {
private volatile Map<String, Object> map = new HashMap<String, Object>();
//利用 ReadWriteLock 对写入操作时锁定 防止其他操作的插入
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//写
public void write(String key, String value){
//拿到写入锁并进行锁定
readWriteLock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName()+"开始写入");
map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入完成");
} catch (Exception e) {
e.printStackTrace();
} finally {
//解锁
readWriteLock.writeLock().unlock();
}
}
//读
public Object read(String key){
System.out.println(Thread.currentThread().getName()+"开始读取");
Object o = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取完成");
return o;
}
}
/*
没有锁的缓存
当一个线程写入时会有其他线程在他没有完成写作时进来写入
*/
class Cache {
private volatile Map<String, Object> map = new HashMap<String, Object>();
//写
public void write(String key, String value){
System.out.println(Thread.currentThread().getName()+"开始写入");
map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入完成");
}
//读
public Object read(String key){
System.out.println(Thread.currentThread().getName()+"开始读取");
Object o = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取完成");
return o;
}
}
未加读写锁 写入混乱
![]()
加了读写锁 顺序写入
![]()