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 秒后拿着枕头的人的编号。…

LeetCode Biweekly Contest 99

这周双周赛,我觉得题目不是很好。基本都是脑经急转弯,非常不友好。 6312. Split With Minimum Sum 给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足: num1 和 num2 直接连起来,得到 num 各数位的一个排列。 换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。 num1 和 num2 可以包含前导 0…

LeetCode Contest 334

6369. Left and Right Sum Differences 给你一个下标从 0 开始的整数数组 nums ,请你找出一个下标从 0 开始的整数数组 answer ,其中: answer.length == nums.length answer = |leftSum - rightSum| 其中: leftSum 是数组 nums 中下标 i 左侧元素之和。如果不存在对应的元素,leftSum…

LeetCode Contest 333

6369. Left and Right Sum Differences 给你一个下标从 0 开始的整数数组 nums ,请你找出一个下标从 0 开始的整数数组 answer ,其中: answer.length == nums.length answer = |leftSum - rightSum| 其中: leftSum 是数组 nums 中下标 i 左侧元素之和。如果不存在对应的元素,leftSum…

LeetCode Biweekly Contest 98

这周双周赛,我觉得题目不是很好。2,3题都是脑经急转弯,最后一题也过于模版。 6359. Maximum Difference by Remapping a Digit 给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。 请你返回将 num 中 恰好一个 数字进行替换后,得到的最大值和最小值的差位多少。 注意: 当 Danny 将一个数字 d1…

LeetCode Contest 332

6354. Find the Array Concatenation Value 给你一个下标从 0 开始的整数数组 nums 。 现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。 例如,15 和 49 的串联是 1549 。 nums 的 串联值 最初等于 0 。执行下述操作直到 nums 变为空: 如果 nums…

ReentrantLock 源码分析 Part 1

今天主要讨论的主题是Java的ReentrantLock的由来和加锁的原理。 为什么需要ReentrantLock 作为程序员,还是需要尽量减少重复造轮子这种事情。但是Java既然已经有了synchronized关键词,Java的大佬们再设计Lock是不是一种重复的轮子呢?当然不是,synchronized有一个问题,我们无法主动释放资源。如下所示: sychronize (a) { sychronize (b) { //.. method body } } 假设我们获取了资源a,但是无法获取资源b。此时我们也无法释放资源a。那么整个系统可能就会处在死锁状态。为了解决这个问题,就需要新的轮子来解决。那就是今天想要介绍的主角ReentrantLock。 使用lock的范式 在这个类的一开始作者就贴心的写上了Java并发所需要用到的范式。因为这些代码在多线程中执行,为了确保就算程序出错抛出了异常,所以finally中务必不要忘记加入解锁的相关代码,否则容易造成不知名的死锁情况。 class X { private final ReentrantLock lock = new ReentrantLock(); //.. public void…

LeetCode Contest 331

首先祝大家元宵节快乐! 6348. Take Gifts From the Richest Pile 给你一个整数数组 gifts ,表示各堆礼物的数量。每一秒,你需要执行以下操作: 选择礼物数量最多的那一堆。 如果不止一堆都符合礼物数量最多,从中选择任一堆即可。 选中的那一堆留下平方根数量的礼物(向下取整),取走其他的礼物。 返回在 k 秒后剩下的礼物数量。 测试样例 输入:gifts = , k = 4 输出:29 解释: 按下述方式取走礼物: 在第一秒,选中最后一堆,剩下 10 个礼物。…