一、读写锁ReadWriteLock
- 代码演示
①、缓存类
public class MyCache {
private volatile Map<String,Object> map=new HashMap<String, Object>();
//创建一个读写锁
private ReentrantReadWriteLock readWriteLock= new ReentrantReadWriteLock();
//写入的时候希望只有一个线程操作
public void put(String key,Object value){
readWriteLock.writeLock().lock();
try{
System.out.println(Thread.currentThread().getName()+"写入----->"+key);
map.put(key,value);
System.out.println(Thread.currentThread().getName()+"写入成功");
}catch (Exception e){
e.printStackTrace();
}finally {
readWriteLock.writeLock().unlock();
}
}
//读取的时候可以多个线程一起操作
public void get(String key){
readWriteLock.readLock().lock();
try{
System.out.println(Thread.currentThread().getName()+"获取了--->"+key);
map.get(key);
System.out.println(Thread.currentThread().getName()+"成功获取");
}catch (Exception e){
e.printStackTrace();
}finally {
readWriteLock.readLock().unlock();
}
}
}
②、测试类
public class ReadWriteLock {
public static void main(String[] args) {
final MyCache myCache = new MyCache();
//写入
for (int i=1;i<=5;i++){
final int temp=i;
new Thread(()->{
myCache.put(temp+"",temp+"");
},String.valueOf(i)).start();
}
//读取
for (int i=1;i<=5;i++){
final int temp=i;
new Thread(()->{
myCache.get(temp+"");
},String.valueOf(i)).start();
}
}
}
- 没有读写锁的运行结果:
可以看到写入的时候多个线程一起的操作,没有等到前一个线程写入成功下一个线程就抢着进行写入了 - 有读写锁的运行结果:
有读写锁的情况下,写操作的线程都是依次进行的,等到一个线程操作完成后再进行下一个下入操作