读写锁

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;    }}