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

135 篇文章 1 订阅
92 篇文章 2 订阅

一、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允许多个读线程同时访问,但凡有一个写线程,其它的读线程就会被阻塞。大多数情况下,读场景多于写场景,所以在读多于写的场景下,读写锁能带来更好的并发性和更多的吞吐量。

img

如上图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();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值