读写锁
ReadWriteLock
ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制
读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的
Demo:
package org.example.rw;import java.util.HashMap;import java.util.Map;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockDemo { /* * 读读 - 可以共存 (共享锁) * 读写 - 不能共存 (独占锁) * 写写 - 不能共存 (独占锁) * */ public static void main(String[] args) { MyCache myCache = new MyCache();// 写入:要求在写入时不能存在插队的情况,以防止写入时资源被抢占 for (int i = 1; i { myCache.put(""+temp,temp); },String.valueOf(i)).start(); }// 读取:可以插队抢占资源以实现资源的最大化利用 for (int i = 1; i { myCache.get(temp+""); },String.valueOf(i)).start(); } }}class MyCache{ private volatile Map cache = new HashMap(); ReadWriteLock rwLock = new ReentrantReadWriteLock();// 细粒化控制:写 - 只希望同一时间只有一条线程写入,写入完成后再进入下一位 public void put(String key,Object value){ rwLock.writeLock().lock(); try { System.out.println(Thread.currentThread().getName()+":"+key+"开始写入"); cache.put(key,value); System.out.println(Thread.currentThread().getName()+":"+key+"写入完成"); }catch (Exception e){ e.printStackTrace(); }finally { rwLock.writeLock().unlock(); } }// 细粒化控制:读 - 所有人都可以读 public Object get(String key){ rwLock.readLock().lock(); Object o = null; try { System.out.println(Thread.currentThread().getName()+":"+key+"开始读取"); o = cache.get(key); System.out.println(Thread.currentThread().getName()+":"+key+"读取完成"); }catch (Exception e){ e.printStackTrace(); }finally { rwLock.readLock().unlock(); } return o; }}