Multi-Programming-10 Re-entrant Locks

2023-11-04 05:40

本文主要是介绍Multi-Programming-10 Re-entrant Locks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.What is the difference between synchronized and re-entrant lock?

这里是关于该问题的讨论。


中文简单解释一下:

问题:'synchronized'和 're-entrant lock'有什么不同,或者换种说法--这两种方式分别在哪些情形下适用?

解答:官方关于're-entrant lock'的解释--重入锁和内在对象监视器方式同步方法或代码块方式具有相同的行为和语法规则;但're-entrant lock'具有更多的扩展能力(翻译的不忍直视,请看原链接)。





2.Conditon await()/signal VS wait()/notify()?

可以查看stackoverflow上关于该问题的解释。


从代码上可以看出,同一个monitor可以有多个condition变量,也就是说:re-entrant lock支持多个wait()/notify()队列。

3.Code demo.

package com.fqy.mix;import java.util.Scanner;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockDemo {public static void main(String[] args) {ReentrantLockDemoUtil.demonstrate();}}class ReentrantLockDemoUtil {public static void demonstrate() {SharedObjectRe sharedObjectRe = new SharedObjectRe();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {try {sharedObjectRe.stageOne();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {sharedObjectRe.stageTwo();}});t1.start();t2.start();try {t1.join();t1.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}sharedObjectRe.afterRunning();}
}class SharedObjectRe {private int count = 0;private ReentrantLock lock = new ReentrantLock();private Condition condition = lock.newCondition();private void increment() {for (int i = 0; i < 10000; i++) {count++;}}public void stageOne() throws InterruptedException {lock.lock();System.out.println(Thread.currentThread().getName() + " is waiting...");condition.await();System.out.println(Thread.currentThread().getName() + ", resumed.");try {increment();} finally {lock.unlock();}}public void stageTwo() {lock.lock();System.out.println(Thread.currentThread().getName() + ", click to continue!");Scanner scanner = new Scanner(System.in);scanner.nextLine();scanner.close();System.out.println(Thread.currentThread().getName() + ", enter key pressed.");condition.signal();try {increment();} finally {lock.unlock();}}public void afterRunning() {System.out.println("The count is: " + count);}
}运行结果:
Thread-0 is waiting...
Thread-1, click to continue!Thread-1, enter key pressed.
Thread-0, resumed.
The count is: 20000



4.己见

对于一般的功能而言,传统的synchronized关键字和re-entrant lock 可以提供相似的功能。但ReentrantLock 有更多的扩展功能可以提供,如可以有多个wait/notify队列;特有的boolean awaitUntil(Date deadline)\void awaitUninterruptedly()等问题。
相关代码和笔记可以在这里看到。

这篇关于Multi-Programming-10 Re-entrant Locks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343613

相关文章

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

013.Python爬虫系列_re正则解析

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

【硬刚ES】ES基础(二十一) 单字符串多字段查询:Multi Match

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

Login failed:make sure your username and password are correct and that you’re an admin or moderator

Login failed:make sure your username and password are correct and that you’re an admin or moderator   1.使用MySql查看工具进入数据库,进入表“ofuser”,把字段 plainPassword 改成 123,然后在你的控制台上输入该表的   username跟plainPa

2015 Multi-University Training Contest 5 1009 MZL#39;s Border

MZL's Border  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5351   Mean:  给出一个类似斐波那契数列的字符串序列,要你求给出的f[n]字符串中截取前m位的字符串s中s[1...i] = s[s.size()-i+1....s.size()]的最大长度。 analyse:   过计算

Segmentation简记-Multi-stream CNN based Video Semantic Segmentation for Automated Driving

创新点 1.RFCN & MSFCN 总结 网络结构如图所示。输入视频得到图像分割结果。 简单粗暴

MaPLe(论文解读): Multi-modal Prompt Learning

Comment: Accepted at CVPR2023 摘要 预训练的视觉语言模型(VL-PTMs)(比如CLIP)在下游任务中已经表现出不错的泛化能力。但是它们对输入文本提示模板的选择很敏感,需要仔细选择提示模板才能表现良好。 受到NLP领域的启发,最近的CLIP的自适应性方法开始学习提示作为文本输入,来微调CLIP以适应下游任务。本文能注意到,在CLIP的单个分支(语言或图像分支)中

解决Re-download dependencies and sync project

解决Re-download dependencies and sync project 问题描述 新建一个工程,报错 Error:Failed to open zip file.Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)<a hr