前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >独占锁(写锁)/共享锁(读锁)/互斥锁

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

作者头像
名字是乱打的
发布2022-05-13 12:32:55
1.4K0
发布2022-05-13 12:32:55
举报
文章被收录于专栏:软件工程

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

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

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

声明一个读写锁

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

写锁demo

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

读锁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;

读写锁实现原理详解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ReentrantReadWriteLock实现原理简单分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档