Java并发编程实战~Lock

再造管程的理由

synchronized导致死锁问题,提出了一个破坏不可抢占条件方案,但是这个方案 synchronized 没有办法解决。原因是 synchronized 申请资源的时候,如果申请不到,线程直接进入阻塞状态了,而线程进入阻塞状态,啥都干不了,也释放不了线程已经占有的资源。但我们希望的是:

对于“不可抢占”这个条件,占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源,这样不可抢占这个条件就破坏掉了。

如果我们重新设计一把互斥锁去解决这个问题,那该怎么设计呢?我觉得有三种方案。

1、能够响应中断。synchronized 的问题是,持有锁 A 后,如果尝试获取锁 B 失败,那么线程就进入阻塞状态,一旦发生死锁,就没有任何机会来唤醒阻塞的线程。但如果阻塞状态的线程能够响应中断信号,也就是说当我们给阻塞的线程发送中断信号的时候,能够唤醒它,那它就有机会释放曾经持有的锁 A。这样就破坏了不可抢占条件了。
2、支持超时。如果线程在一段时间之内没有获取到锁,不是进入阻塞状态,而是返回一个错误,那这个线程也有机会释放曾经持有的锁。这样也能破坏不可抢占条件。
3、非阻塞地获取锁。如果尝试获取锁失败,并不进入阻塞状态,而是直接返回,那这个线程也有机会释放曾经持有的锁。这样也能破坏不可抢占条件。
这三种方案可以全面弥补 synchronized 的问题。到这里相信你应该也能理解了,这三个方案就是“重复造轮子”的主要原因,体现在 API 上,就是 Lock 接口的三个方法。详情如下:

// 支持中断的 API
void lockInterruptibly() throws InterruptedException;
// 支持超时的 API
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 支持非阻塞获取锁的 API
boolean tryLock();

如何保证可见性

class X {private final Lock rtl = new ReentrantLock();int value;public void addOne() {// 获取锁rtl.lock();  try {value+=1;} finally {// 保证锁能释放rtl.unlock();}}
}

ReentrantLock,内部持有一个 volatile 的成员变量 state,获取锁的时候,会读写 state 的值;解锁的时候,也会读写 state 的值(简化后的代码如下面所示)。也就是说,在执行 value+=1 之前,程序先读写了一次 volatile 变量 state,在执行 value+=1 之后,又读写了一次 volatile 变量 state。根据相关的 Happens-Before 规则:
1、顺序性规则:对于线程 T1,value+=1 Happens-Before 释放锁的操作 unlock();
2、volatile 变量规则:由于 state = 1 会先读取 state,所以线程 T1 的 unlock() 操作 Happens-Before 线程 T2 的 lock() 操作;
3、传递性规则:线程 T1 的 value+=1 Happens-Before 线程 T2 的 lock() 操作。

class SampleLock {volatile int state;// 加锁lock() {// 省略代码无数state = 1;}// 解锁unlock() {// 省略代码无数state = 0;}
}

什么是可重入锁

所谓可重入锁,顾名思义,指的是线程可以重复获取同一把锁

除了可重入锁,可能你还听说过可重入函数,可重入函数怎么理解呢?指的是线程可以重复调用?显然不是,所谓可重入函数,指的是多个线程可以同时调用该函数,每个线程都能得到正确结果;同时在一个线程内支持线程切换,无论被切换多少次,结果都是正确的。多线程可以同时执行,还支持线程切换,这意味着什么呢?线程安全啊。所以,可重入函数是线程安全的。

class X {private final Lock rtl = new ReentrantLock();int value;public int get() {// 获取锁rtl.lock();         try {return value;} finally {// 保证锁能释放rtl.unlock();}}public void addOne() {// 获取锁rtl.lock();  try {value = 1 + get(); } finally {// 保证锁能释放rtl.unlock();}}
}

公平锁与非公平锁

在使用 ReentrantLock 的时候,你会发现 ReentrantLock 这个类有两个构造函数,一个是无参构造函数,一个是传入 fair 参数的构造函数。fair 参数代表的是锁的公平策略,如果传入 true 就表示需要构造一个公平锁,反之则表示要构造一个非公平锁

// 无参构造函数:默认非公平锁
public ReentrantLock() {sync = new NonfairSync();
}
// 根据公平策略参数创建锁
public ReentrantLock(boolean fair){sync = fair ? new FairSync() : new NonfairSync();
}

锁都对应着一个等待队列,如果一个线程没有获得锁,就会进入等待队列,当有线程释放锁的时候,就需要从等待队列中唤醒一个等待的线程。如果是公平锁,唤醒的策略就是谁等待的时间长,就唤醒谁,很公平;如果是非公平锁,则不提供这个公平保证,有可能等待时间短的线程反而先被唤醒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf 点击按钮弹出选择框_WPF-PopupWindow wpf右下角弹出框,通过按钮调用,类似QQ CSharp C#编程 238万源代码下载- www.pudn.com...

文件名称: WPF-PopupWindow下载收藏√ [5 4 3 2 1 ]开发工具: C#文件大小: 90 KB上传时间: 2013-07-24下载次数: 19详细说明:wpf右下角弹出框,通过按钮调用,类似QQ弹出框-wpf lower right corner of the pop-up box文件列表(点击判断是否…

2018 年人工智能会怎么发展?这里有 8 个预测

来源:36氪普华永道发布了一份报告,对人工智能在2018年的发展趋势进行了研究,并做出了8项预测。人工智能非常复杂,而且发展速度很快。任何人都不可能对其未来几年的发展方向做出准确的预测。但就人工智能在2018年的发展趋势来说&am…

异常单据锁定涉及的数据库表

在软件使用过程中出现单据锁定提示,进入系统管理清除单据锁定,再进入软件还是提示单据锁定.(包括:审核凭证时提示单据锁定;不能录入期初余额,提示单据锁定;银行对帐单锁定 等情况) 造…

C 和 C++ 文件操作详解

来源:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551662.html 来源:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html CPP 的文件操作 在C中,有一个stream这个类,所有的I/O都以这个“流”类为基础的…

redis 判断存在性_springboot + redis + 注解 + 拦截器 实现接口幂等性校验

提醒:后面有些图片模糊,请点击原文查看清晰图片一、概念幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次比如:订单接口, 不能多次创建订单支付接口, 重复支付同一笔订单只能扣一次钱支付宝回调接口, 可能会多次回调, 必须处…

C++学习之路 | PTA乙级—— 1089 狼人杀-简单版(精简)

1089 狼人杀-简单版 (20 分)以下文字摘自《灵机一动好玩的数学》:“狼人杀”游戏分为狼人、好人两大阵营。在一局“狼人杀”游戏中,1 号玩家说:“2 号是狼人”,2 号玩家说:“3 号是好人”,3 号玩家说&#…

Java并发编程实战~Condition

利用两个条件变量快速实现阻塞队列呢&#xff1f; public class BlockedQueue<T>{final Lock lock new ReentrantLock();// 条件变量&#xff1a;队列不满 final Condition notFull lock.newCondition();// 条件变量&#xff1a;队列不空 final Condition notEmpty …

汽车行业最大创新仍未到来,四大力量将重塑未来汽车新纪元

来源&#xff1a; 资本实验室 作者&#xff1a;王进自第一辆福特“T”型车问世以来&#xff0c;汽车行业已经诞生了众多层出不穷、持续进化的创新成果。例如&#xff0c;制造商不断创造了新的车体风格&#xff0c;拓展了新的市场区隔&#xff0c;改进了自动换档和动力转向系…

C++学习之路 | PTA乙级——1090 危险品装箱 (25 分)(精简)

1090 危险品装箱 (25 分) 集装箱运输货物时&#xff0c;我们必须特别小心&#xff0c;不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱&#xff0c;否则很容易造成爆炸。 本题给定一张不相容物品的清单&#xff0c;需要你检查每一张集装箱货品清单&#x…

echarts柱形图x轴y轴互换_数控机床在加工零件时,突然出现X、Y、Z轴失控?如何处理...

数控机床现在广泛应用于单品种大批量的零件加工中&#xff0c;由于稳定性强、精度高、效率高&#xff0c;取代了原来的普通机床。同时数控铣床、数控车床被大规模的配置到各产品自动化生产线上&#xff0c;实现了自动化无入管理。但在生产中由于数控机床的伺服系统出现故障&…

PHP新手上路(十)

9. 简易banner动态更替   不知大家有没有发现各大站点上的标头广告banner&#xff0c;我们每次访问这些站点时&#xff0c;都会看到不同的广告图标&#xff0c;或者如果你每次刷新页面时&#xff0c;这些广告banner就会不断地随机更替变换。要实现这种效果虽然用javascript…

python beautiful soup库的用法

Python 爬虫利器二 之 Beautiful Soup 的用法&#xff1a;http://cuiqingcai.com/1319.html Beautiful Soup 4.2.0 文档&#xff1a;https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html Python3 --- BeautifulSoup --- 节点选择器&#xff1a;https://www.…

Java并发编程实战~原子类

对于简单的原子性问题&#xff0c;还有一种无锁方案&#xff0c;先看看如何利用原子类解决累加器问题。 public class Test {AtomicLong count new AtomicLong(0);public void add10K() {int idx 0;while(idx < 10000) {count.getAndIncrement();}}} 无锁方案相对互斥锁…

著名物理学家斯蒂芬•霍金去世,他曾告诫人类要学会避免人工智能可能的风险

据多家媒体报道&#xff0c;著名的英国物理学家斯蒂芬霍金于3 月 14 日去世&#xff0c;享年 76 岁。霍金教授的孩子露西&#xff0c;罗伯特和蒂姆发表了声明确认了这一消息。斯蒂芬威廉霍金(Stephen William Hawking)&#xff0c;1942年1月8日出生于英国牛津&#xff0c;英国剑…

对《生产流水线模式》讨论的总结性回复

我的上一篇文章《生产流水线模式》发布以后&#xff0c;引起了很多朋友的关注&#xff0c;大家发表了很多意见&#xff0c;现在我针对留言中大家提得比较多的问题&#xff0c;做一个总结性的回复。 问题一&#xff1a;我的敏捷开发架构是不是只实现了简单的增删改查功能&#x…

C++学习之路 | PTA乙级—— 1091 N-自守数 (15 分)(精简)

1091 N-自守数 (15 分) 如果某个数 K 的平方乘以 N 以后&#xff0c;结果的末尾几位数等于 K&#xff0c;那么就称这个数为“N-自守数”。例如 392​2​​25392&#xff0c;而 25392 的末尾两位正好是 92&#xff0c;所以 92 是一个 3-自守数。 本题就请你编写程序判断一个给定…

电路板上的插头怎么拔下来_空调插头一直不拔费电吗?实测一周竟然发现了真相!...

随着气温的不断走低&#xff0c;全国绝大部分城市已经进入了真正意义上的秋天。那么&#xff0c;经过了酷热一夏&#xff0c;你家的空调电源插头拔掉了吗? 说道空调&#xff0c;想必大家都知道这“家伙”可是耗电大户。尤其在七八月份&#xff0c;几乎都是24小时不停机在运行。…

C++ stringstream

参考&#xff1a;http://www.usidcbbs.com/read-htm-tid-1898.html 常见格式串 %% 印出百分比符号&#xff0c;不转换。 %c 整数转成对应的 ASCII 字元。 %d 整数转成十进位。 %f 倍精确度数字转成浮点数。 %o 整数转成八进位。 %s 整数转成字符串。 %x 整数转成小写十六进位…

Java并发编程实战~思维导图

#原图 System.out.println("https://www.processon.com/view/link/61a235be1efad425fd6ff5f6")

中国“脑计划”研究正在悄然布局

来源&#xff1a;中国科学报 作者&#xff1a;黄辛 作为“十三五”上海科研发展的重点&#xff0c;一张神奇的脑计划研究“地图”正在悄然加紧布局。日前&#xff0c;在教育部科技司、国家自然科学基金委员会政策局、华东师范大学主办的“交叉融合的教育科学基础研究”研讨会上…