面时莫慌 | Reetrant[ReadWrite]Lock类图分析实践

Posted Java-桃子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面时莫慌 | Reetrant[ReadWrite]Lock类图分析实践相关的知识,希望对你有一定的参考价值。

一、ReetrantLock实现类图分析

ReetrantLock是一个独占锁、可重入锁。所谓独占锁是只有一个线程可以获取占有它。ReetrantLock锁包括fairReetrantLock和unfairReetrantLock。fairReetrantLock是指不同线程获取锁的机制是公平的,unfairReetrantLock是指不同线程获取线程是不公平的。公平或不公平体现在是否多个线程按照申请锁的顺序来获取锁,如果是就是公平的,否则就是不公平的。

如上图UML类图所示。

  • ReentrantLock 实现了Lock接口。
  • 在ReentrantLock 中有一个成员变量sync,sync的类型是Sync,Sync是一个抽象类,它集成自AQS(AbstractQueuedSynchronizer)。
  • 在ReentrantLock 中有fair lock,即类FairSync ;还有unfair lock,即l类NonFairSync ,这两个类都是Sync的子类,这意味着ReentrantLock 具体使用的时候只能在公平锁和非公平锁中任选其一,默认情况是不公平锁。

二、ReentrantReadWriteLock实现类图分析

ReentrantLock是独占锁,ReentrantReadWriteLock并完全是独占锁,它的读锁是共享锁,写锁是独占锁。所以ReentrantReadWriteLock允许多个读线程同时访问,但凡有一个写线程,其它的读线程就会被阻塞。大多数情况下,读场景多于写场景,所以在读多于写的场景下,读写锁能带来更好的并发性和更多的吞吐量。

如上图UML类图所示。

  • ReentrantReadWriteLock是ReadWriteLock的实现类
  • ReentrantReadWriteLock包含了成员变量sync、readLock,writeLock,sync的类型为Sync,这点与ReentrantLock一样,是从AQS继承而来的抽象类。readLock的类型是ReadLock,writeLock的类型是WriteLock,ReadLock和WriteLock都实现了Lock接口。

三、例子

ReentrantLock

public class LockExample {
    private static final ReentrantLock FAIR_LOCK = new ReentrantLock(true);
    private static int i;
​
    public static void add(){
        FAIR_LOCK.lock();
        try {
            Thread.yield();
            i++;
        } catch (Exception e){
            throw new RuntimeException(e);
        }finally {
            FAIR_LOCK.unlock();
        }
    }
​
    public static void unsafeAdd(){
        i++;
    }
}
​
复制代码

ReentrantReadWriteLock

public class ReadWriteLockExample {
​
    static final Map<String,String> CACHE = new HashMap<>();
    static final ReentrantReadWriteLock RRW_LOCK = new ReentrantReadWriteLock();
    static final Lock R_LOCK = RRW_LOCK.readLock();
    static final Lock W_LOCK = RRW_LOCK.writeLock();
​
    public static  String get(String key){
        R_LOCK.lock();
        try{
            return CACHE.get(key);
        } finally {
            R_LOCK.unlock();
        }
    }
​
    public static void put(String key,String value){
        W_LOCK.lock();
        try{
            CACHE.put(key,value);
        }finally {
            W_LOCK.unlock();
        }
    }
}

以上是关于面时莫慌 | Reetrant[ReadWrite]Lock类图分析实践的主要内容,如果未能解决你的问题,请参考以下文章

在 Blender 中挤出面时保持纹理不拉伸?

php 在Shop页面上使用构面时忽略WooCommerce Membership产品限制。

遭遇人工智能?莫慌!我们有必杀技

❤️Android 应用崩溃?嗯?莫慌,稳住!❤️

U盘文件找不到了?莫慌!!!

U盘文件找不到了?莫慌!!!