中易网

Java线程死锁如何避免这一悲剧

答案:1  悬赏:40  
解决时间 2021-04-08 06:28
Java线程死锁如何避免这一悲剧
最佳答案
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键。不幸的是,使用上锁会带来其他问题。让我们来看一些常见问题以及相应的解决方法: Java线程死锁 Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。
假如线程 “A”获得了刀,而线程“B”获得了叉。线程“A”就会进入阻塞状态来等待获得叉,而线程“B”则阻塞来等待“A”所拥有的刀。这只是人为设计的例子,但尽管在运行时很难探测到,这类情况却时常发生。虽然要探测或推敲各种情况是非常困难的,但只要按照下面几条规则去设计系统,就能够避免Java线程死锁问题:
让所有的线程按照同样的顺序获得一组锁。这种方法消除了 X 和 Y 的拥有者分别等待对方的资源的问题。
将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。
将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。
最重要的是,在编写代码前认真仔细地设计整个系统。多线程是困难的,在开始编程之前详细设计系统能够帮助你避免难以发现Java线程死锁的问题。
Volatile 变量,volatile 关键字是 Java 语言为优化编译器设计的。以下面的代码为例:
1.class VolatileTest {
2.public void foo() {
3.boolean flag = false;
4.if(flag) {
5.//this could happen 6.}
7.}
8.}
一个优化的编译器可能会判断出if部分的语句永远不会被执行,就根本不会编译这部分的代码。如果这个类被多线程访问, flag被前面某个线程设置之后,在它被if语句测试之前,可以被其他线程重新设置。用volatile关键字来声明变量,就可以告诉编译器在编译的时候,不需要通过预测变量值来优化这部分的代码。
无法访问的Java线程死锁有时候虽然获取对象锁没有问题,线程依然有可能进入阻塞状态。在 Java 编程中IO就是这类问题最好的例子。当线程因为对象内的IO调用而阻塞时,此对象应当仍能被其他线程访问。该对象通常有责任取消这个阻塞的IO操作。造成阻塞调用的线程常常会令同步任务失败。如果该对象的其他方法也是同步的,当线程被阻塞时,此对象也就相当于被冷冻住了。
其他的线程由于不能获得对象的Java线程死锁,就不能给此对象发消息(例如,取消 IO 操作)。必须确保不在同步代码中包含那些阻塞调用,或确认在一个用同步阻塞代码的对象中存在非同步方法。尽管这种方法需要花费一些注意力来保证结果代码安全运行,但它允许在拥有对象的线程发生阻塞后,该对象仍能够响应其他线程。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
798烤肉崇福店怎么去啊,有知道地址的么
2013年1一8月的税收,按税款入库时间填,该怎样
江铃宝典加长版总长是几米
要学软件技术英语特别不好怎么办
结算单是什么意思
机床需要接地但没接地线怎么办?
碧欧泉橄榄青春2次源眼霜同温泉水元素眼部精
电脑桌面就跟打了马赛克样怎么办
吉川造型总店地址在哪,我要去那里办事
形容度假的词语
《房贷》假如我在A银行贷款后,过几年看到B银
鑫欣自行车行地址有知道的么?有点事想过去
联想miix5 pro真的好吵吗
请教电线电缆辐照工序怎么验收?
拉图拉甘酒庄在什么地方啊,我要过去处理事情
推荐资讯
我喜欢一个女孩,高中同学,但她说我不是她喜
宣汉县国艺建筑工程公司地址有知道的么?有点
商丘回睢县最晚的车几点
绿色园水果大卖场(金汇店)在哪里啊,我有事要
菜锅炒菜老是把菜烧焦,放再多的油开再小的火
如何让蛋鸭产蛋高峰期维持到60周龄?
活佛的意思
就是问下造价有没有加权平均说法。就是说清单
东华帝君多少岁了
求大师指点,下图阳台看到江景,请问有没有反
在foxpro6.0中用命令如何打开名为"学生表.DBF
新疆城镇居民医疗保险含重大疾病保险吗
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?