ReadWriterLock读写锁

首先要了解独占锁和共享锁

  • 独占锁:一次只能被一个线程占用
  • 共享锁:多个线程可以同时占用
java.util.concurrent.locks.ReadWriteLock就是使用了独占锁和共享锁,实现了读写的控制
Demo如下:
public class ReadWriterLockDemo {
    public static void main(String[] args) {
        MyCacah myCacah = new MyCacah();
        //写入
        for (int i = 0; i < 6; i++) {
            final int temp = i;
            new Thread(()->{
                myCacah.put(temp+"",temp+"");
            },String.valueOf(i)).start();
        }
        //读取
        for (int i = 0; i < 6; i++) {
            final int temp = i;
            new Thread(()->{
                myCacah.get(temp+"");
            },String.valueOf(i)).start();
        }
    }

}
class MyCacah{
    private Map<String,String> map = new HashMap<>();
    ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    //写入
    public void put(String key,String 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();
        }
    }
}

 通过运行结果可知,写入操作是有序的,而读取的操作是无序的,也就是说,写入时独占锁,读取是共享锁

posted @ 2020-05-21 16:02  小小吸血鬼  阅读(219)  评论(0编辑  收藏  举报