J.U.C之AQS-ReentrantReadWriteLock

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34203492/article/details/82629752

简单说一下ReentrantReadWriteLock

简介
ReentrantReadWriteLock是一个读写锁,所谓读写锁,是对访问资源共享锁和排斥锁,一般的重入性语义为:如果对资源加了写锁,其他线程无法再获得写锁与读锁,但是持有写锁的线程,可以对资源加读锁(锁降级);如果一个线程对资源加了读锁,其他线程可以继续加读锁。
所以ReentrantReadWriteLock的写入锁只能有唯一的所有者,并且只能由获得该锁的线程来释放。

与ReentrantLock类似,ReentrantReadWriteLock在构造时也可以选择公平锁或者非公平锁。在公平锁中,等待时间最长的线程将优先获得锁。如果这个锁由读线程持有,而另一个线程请求写入锁,那么其他读线程都不能获得读取锁,直到写线程使用完并且释放了写入锁。在非公平锁中,线程获取访问许可的顺序是不确定的。写线程降级为读线程是可以的,但读线程升级为写线程是不可以的(这样会导致死锁)。

用一个代码演示一下ReentrantReadWriteLock:
代码来源于《java并发编程实战》程序清单13-7,注释是我自己加的 如有错误请谅解

import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteMap<K, V> {

    private final Map<K, V> map;        //定义一个map

    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    private final Lock r = lock.readLock();     //读锁

    private final Lock w = lock.writeLock();    //写锁

    public ReadWriteMap(Map<K, V> map){     //构造
        this.map = map;
    }

    public V put(K key, V value){           //put方法先加写入锁  然后进行写操作  在finally里面进行释放锁
        w.lock();
        try{
            return map.put(key, value);
        }finally {
            w.unlock();
        }
    }
    // 对remove(), putAll(), clear()等方法执行相同操作



    public V get(Object key){               //get方法先加读锁   然后进行读操作  在finally里面进行释放锁
        r.lock();
        try {
            return map.get(key);
        }finally {
            r.unlock();
        }
    }
    // 对其他只读的Map方法执行相同的操作

}

介绍完毕
个人浅薄理解,欢迎补充
点击链接加入群聊【Java技术学习闲聊群】:https://jq.qq.com/?_wv=1027&k=59emCBA

猜你喜欢

转载自blog.csdn.net/qq_34203492/article/details/82629752
今日推荐