ReentrantReadWriteLock基础介绍

简介 之前我们主要介绍了ReentrantLock和其相关的Condition的内容。今天我们主要会过一下ReentrantReadWriteLock的代码。现实中,读写锁的使用非常多。如果你也是一个大数据工程师,同时使用过Spark的话,就会知道Spark内部有一个BlockInfoManager的类。在大数据计算中,常用的是基于复制的模式,读多写少的任务非常常见,有读写锁可以有效的减少锁竞争,提高数据查询速率。今天这一节,我们就简单介绍一下ReentrantReadWriteLock和它背后的一点数学知识。 读写锁的3条规定: 允许多个线程同时读共享变量 只允许一个线程写共享变量 如果写线程正在执行写出操作,那么禁止其他线程读写共享变量。 ReentrantReadWriteLock的特殊属性:锁降级:遵循先获取写锁,获取读锁,再释放写锁的次序。写锁可以降级成读锁 ReentrantReadWriteLock的实现的接口是ReadWriteLock: public interface ReadWriteLock { /** * Returns the lock used for reading. * * @return the lock used for reading */ Lock…

LeetCode Contest 339

6362. Find the Longest Balanced Substring of a Binary String 给你一个仅由 0 和 1 组成的二进制字符串 s 。 如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。请注意,空子字符串也视作平衡子字符串。…

LeetCode Biweekly Contest 101

6327. Form Smallest Number From Two Digit Arrays 给你两个只包含 1 到 9 之间数字的数组 nums1 和 nums2 ,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。 测试样例 输入:nums1 = , nums2 = 输出:15…

LeetCode Contest 338

6354. K Items With the Maximum Sum 袋子中装有一些物品,每个物品上都标记着数字 1 、0 或 -1 。 给你四个非负整数 numOnes 、numZeros 、numNegOnes 和 k 。 袋子最初包含: numOnes 件标记为 1 的物品。 numZeroes 件标记为 0 的物品。 numNegOnes…

Condition的源码分析

这篇我们会继续讲解一个经常和ReentrantLock配套使用的组建:Condition。对于Condition来说,一切的故事开始于: public Condition newCondition() { return sync.newCondition(); } sync对象封装了该方法: final ConditionObject newCondition() { return new ConditionObject(); } ConditionObject就是Condition的实现类,该对象也在AQS的文件中。它有2个成员对象: /** First node of condition queue. */ private transient Node firstWaiter; /**…

LeetCode Contest 337

6319. Number of Even and Odd Bits 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的偶数下标的个数。 用 odd 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的奇数下标的个数。…

LeetCode Biweekly Contest 100

6323. Distribute Money to Maximum Children 给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。 你需要按照如下规则分配: 所有的钱都必须被分配。 每个儿童至少获得 1 美元。 没有人获得 4 美元。 请你按照上述规则分配金钱,并返回 最多 有多少个儿童获得 恰好 8 美元。如果没有任何分配方案,返回 -1 。 测试样例 输入:money =…

LeetCode Contest 336

6315. Count the Number of Vowel Strings in Range 给你一个下标从 0 开始的字符串数组 words 和两个整数:left 和 right 。 如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 'a'、'e'、'i'、'o'、'u' 。 返回 words 是元音字符串的数目,其中 i 在闭区间 内。 测试样例 输入:words…

ReentrantLock 源码分析 Part 2

今天我们继续更新Java并发系列,往期内容大家可以点击Java并发系列查看。接着上一次内容,这次主要会讲解一下ReentrantLock的解锁流程. unlock函数 上次我们提到了ReentrantLock的使用范式中: class X { private final ReentrantLock lock = new ReentrantLock(); //.. public void m() { lock.lock(); try { //.. method body } finally { lock.unlock(); } }…

LeetCode Contest 335

6307. Pass the Pillow n 个人站成一排,按从 1 到 n 编号。 最初,排在队首的第一个人拿着一个枕头。每秒钟,拿着枕头的人会将枕头传递给队伍中的下一个人。一旦枕头到达队首或队尾,传递方向就会改变,队伍会继续沿相反方向传递枕头。 例如,当枕头到达第 n 个人时,TA 会将枕头传递给第 n - 1 个人,然后传递给第 n - 2 个人,依此类推。 给你两个正整数 n 和 time ,返回 time 秒后拿着枕头的人的编号。…