java独占锁和互斥锁_独占锁(写锁)/共享锁(读锁)/互斥锁

独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁

共享锁:指该锁可被多个线程所持有。对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁。

读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。

使用方法

9cd7f8d514b9

声明一个读写锁

如果需要独占锁则加从可重入读写锁里得到写锁

9cd7f8d514b9

写锁demo

如果需要共享锁则加从可重入读写锁里得到读锁

9cd7f8d514b9

读锁demo

ReentrantReadWriteLock实现原理简单分析

ReentrantReadWriteLock 的核心是由一个基于AQS的同步器 Sync 构成,然后由其扩展出 ReadLock (共享锁), WriteLock (排它锁)所组成。

并且从 ReentrantReadWriteLock 的构造函数中可以发现 ReadLock 与 WriteLock 使用的是同一个Sync

Sync的实现

sync 是读写锁实现的核心, sync 是基于AQS实现的,在AQS中核心是state字段和双端队列,那么一个一个问题来分析。

Sync是如何同时表示读锁与写锁?

清单2:读写锁状态获取

static final int SHARED_SHIFT = 16;

static final int SHARED_UNIT = (1 << SHARED_SHIFT);

static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1;

static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;

/** Returns the number of shared holds represented in count /

static int sharedCount(int c) { return c >>> SHARED_SHIFT; }

/* Returns the number of exclusive holds represented in count */

static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }

从代码中获取读写状态可以看出其是把 state(int32位) 字段分成高16位与低16位,其中高16位表示读锁个数,低16位表示写锁个数

一个线程获取到了写锁,并且重入了两次,低16位是3,线程又获取了读锁,并且重入了一次,高16位就是2

读锁的写锁的获取主要调用AQS的相关Acquire方法,其释放主要用了相关Release方法,其中关于AQS的升级降级锁个数的调整还用到了CAS;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值