如何避免Java线程中的死锁?

如何避免Java死锁? 是Java面试中最受欢迎的问题之一,也是本季多线程的风格,主要是在高层提出,并带有很多后续问题。 尽管问题看起来很基础,但是一旦您开始深入研究,大多数Java开发人员就会陷入困境。

面试问题始于“什么是僵局?”

当两个或多个线程正在等待彼此释放所需的资源(锁定)并无限期陷入困境时,答案很简单,这种情况称为死锁。 它只会在多任务 或多线程的情况下发生。

如何检测Java中的死锁?

尽管这可能会有很多答案,但我的版本是:如果我看到一个嵌套的同步块或从另一个调用一个同步方法,或者试图锁定另一个对象,那么我将看一下代码,那么很有可能发生死锁如果开发人员不是很谨慎。

另一种方法是在运行应用程序时实际上陷入僵局时找到它,尝试进行线程转储,在Linux中,您可以通过“ kill -3”命令执行此操作,这将在应用程序日志文件中打印所有线程的状态您可以看到哪个线程锁定在哪个对象上。

您可以使用fastthread.io之类的工具来分析该线程转储,该工具允许您上载线程转储并进行分析。

另一种方法是使用jConsole / VisualVM ,它将确切显示正在锁定的线程以及在哪个对象上。

编写Java程序会导致死锁?

一旦回答了前面的问题,他们可能会要求您编写代码,这会导致Java死锁?

这是我的版本之一:

/*** Java program to create a deadlock by imposing circular wait.* * @author WINDOWS 8**/
public class DeadLockDemo {/** This method request two locks, first String and then Integer*/public void method1() {synchronized (String.class) {System.out.println("Aquired lock on String.class object");synchronized (Integer.class) {System.out.println("Aquired lock on Integer.class object");}}}/** This method also requests same two lock but in exactly* Opposite order i.e. first Integer and then String. * This creates potential deadlock, if one thread holds String lock* and other holds Integer lock and they wait for each other, forever.*/public void method2() {synchronized (Integer.class) {System.out.println("Aquired lock on Integer.class object");synchronized (String.class) {System.out.println("Aquired lock on String.class object");}}}
}

如果method1()和method2()都将被两个或多个线程调用,则死锁的可能性很大,因为如果线程1在执行method1()时获得Sting对象的锁,而线程2在执行method2时获得Integer对象的锁, () 都将互相等待,以释放对Integer的锁定 ,而String继续进行下去,这将永远不会发生。

此图准确地演示了我们的程序,其中一个线程在一个对象上持有一个锁,然后等待另一线程持有的其他对象锁。

避免死锁

您会看到线程1想要锁定对象2的锁,该对象2由线程2持有,而线程2想要锁定对象1的锁,该对象1由线程1持有。由于没有线程愿意放弃,因此存在死锁,并且线程2 Java程序被卡住。

如何避免Java死锁?

现在,面试官进入最后一部分,在我看来,这是最重要的部分。
您如何解决代码中的死锁?如何避免Java中的死锁?

如果您仔细查看了上面的代码,那么您可能已经发现造成死锁的真正原因不是多个线程,而是它们请求锁定的方式,如果您提供有序访问,那么问题将得到解决。

这是我的固定版本,它通过无效循环的循环等待来避免死锁, 而没有抢占 ,这是需要死锁的四个条件之一。

public class DeadLockFixed {/*** Both method are now requesting lock in same order, first Integer and then String.* You could have also done reverse e.g. first String and then Integer,* both will solve the problem, as long as both method are requesting lock* in consistent order.*/public void method1() {synchronized (Integer.class) {System.out.println("Aquired lock on Integer.class object");synchronized (String.class) {System.out.println("Aquired lock on String.class object");}}}public void method2() {synchronized (Integer.class) {System.out.println("Aquired lock on Integer.class object");synchronized (String.class) {System.out.println("Aquired lock on String.class object");}}}
}

现在将没有任何死锁,因为这两个方法都以相同的顺序访问Integer和String类文字的锁。 因此,如果线程A获得了对Integer对象的锁定,则线程B直到线程A释放Integer锁定后才会继续进行,即使线程B持有字符串锁,线程A也不会被阻塞,因为现在线程B不会期望线程A释放整数锁可继续进行。

感谢您阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何疑问或反馈,请留言。

翻译自: https://www.javacodegeeks.com/2018/08/avoid-deadlock-java-threads.html

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

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

相关文章

Approximation and fitting、Statistical estimation

一、Approximation and fitting 1. 拟合与回归的区别 回归分析:是一种统计学上分析数据的方法,目的在于了解两个或多个变量间是否相关、相关方向与强度,并建立数学模型以便观察特定变量来预测研究者感兴趣的变量。 拟合:是一种把…

Probability(概率) vs Likelihood(似然)

1. 先验概率,条件概率与后验概率 2. Probability(概率) vs Likelihood(似然) Probabiity(概率):给定某一参数值,求某一结果的可能性 Likelihood(似然):给定某一结果,求某…

【渝粤题库】国家开放大学2021春1334纳税筹划题目

试卷代号:1334 2021年春季学期期末统一考试 纳税筹划 试题(开卷) 2021年7月 一、单项选择题(将每题4个选项中的惟一正确答案的字母序号填入括号。每小题2分,共20分) 1.税收筹划的主体是( &#…

线性回归 逻辑回归

分类就是到底是1类别还是0类别。 回归就是预测的不是一个类别的值,而是一个具体的值,具体借给你多少钱哪? 一、回归分析 回归分析(英语:Regression Analysis)是一种统计学上分析数据的方法,目…

【渝粤题库】国家开放大学2021春1335幼儿园课程与活动设计题目

试卷代号:1335 2021年春季学期期末统一考试 幼儿园课程与活动设计 试题 2021年7月 一、单项选择题(每小题3分.共30分) 1.课程是指学生体验到的意义,这是( )对课程的定义。 A.课程即教学科目 B.课程即学习者…

rmi full gc问题_RMI强制Full GC每小时运行一次

rmi full gc问题在我职业生涯中进行的所有故障排除练习中,我都感觉到,随着时间的推移,我所追寻的错误在不断演变,变得越来越卑鄙和丑陋。 也许仅仅是我的年龄开始了。这个特别的Heisenbug –看起来像这篇帖子一样,再次…

【渝粤题库】国家开放大学2021春1349学前教育科研方法答案

试卷代号:1349 2021年春季学期期末统一考试 学前教育科研方法 试题答案及评分标准(开卷) (供参考) 2021年7月 一、单选题(每题4分,共20分) 1.D 2.D 3.C 4.B 5.A 二、判断题&#xff…

联邦学习 Federated Learning

应该很多人听过但是始终都没懂啥是联邦学习?百度一下发现大篇文章都说可以用来解决数据孤岛,那它又是如何来解决数据孤岛问题的? 1、联邦学习的背景介绍 近年来人工智能可谓风风火火,掀起一波又一波浪潮,从人脸识别、…

【渝粤题库】国家开放大学2021春1356高级英语听说(2)题目

试卷代号: 1356 2021年春季学期期末统一考试 高级英语听说(2) 试题 2021年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。 二、…

【渝粤题库】国家开放大学2021春1374班级管理题目

试卷代号:1374 2021年春季学期期末统一考试 班级管理 试题(开卷) 2021年7月 一、简答题(每题12分,共36分) 1.简述班集体建设的理念。 2.简述学生学习指导中的诊疗模式。 3.简述班主…

优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

本文将梳理: 每个算法的梯度更新规则和缺点 为了应对这个不足而提出的下一个算法 超参数的一般设定值 几种算法的效果比较 选择哪种算法 0.梯度下降法深入理解 以下为个人总结,如有错误之处,各位前辈请指出。 对于优化算法,优化…

【渝粤题库】国家开放大学2021春1396药事管理与法规(本)题目

试卷代号:1396 2021年春季学期期末统一考试 药事管理与法规(本) 试题 2021年7月 一、单选题(选出一个最佳答案填入括号.35题,每题2分,共70分) 1.( )就是药学事业的简称&a…

gradle构建_指定Gradle构建属性

gradle构建属性是用于轻松自定义Gradle构建和Gradle环境的宝贵工具。 我将在本文中演示一些用于指定Gradle构建中使用的属性的方法。 Gradle支持项目属性和系统属性 。 这篇文章中有趣的是两者之间的主要区别是如何访问它们。 项目属性更有助于按名称直接访问,而系…

【渝粤题库】国家开放大学2021春1439临床药理学题目

试卷代号:1439 2021年春季学期期末统一考试 临床药理学 试题 2021年7月 一、单项选择题(选择一个最佳选项,每题2分,共80分) 1.临床药理学研究的内容是( )。 A.临床药效学研究 B.临床药物代谢动力…

线性代数之——行列式及其性质

https://zhuanlan.zhihu.com/p/50912180

【渝粤题库】国家开放大学2021春1542投资学题目

试卷代号:1542 2021年春季学期期末统一考试 投资学 试题 2021年7月 一、名词配伍(请将你认为的正确答案的字母填入该题后的括号内。每小题3分,共15分) 1.长期投资( ) 2.同业拆借市场( &#xff…

Apache Commons ArrayUtils.toString(Object)与JDK Arrays.toString(Object)

Apache Commons Lang提供了一个ArrayUtils类,其中包含toString(Object)方法,该方法“将数组作为字符串输出”。 在本文中,我将研究当JDK提供Arrays.toString(Object [])方法[以及原始类型数组的…

【渝粤题库】国家开放大学2021春1340古代小说戏曲专题题目

试卷代号:1340 2021年春季学期期末统一考试 古代小说戏曲专题 试题(开卷) 2021年7月 一、选择题(每题1分,共10分) 1.长篇小说《海上花列传》在题材类型上属于( )。 A.历史演义小说 B…

Cauchy-Schwarz不等式

1. Cauchy不等式 ##2. 推广:HolderH\ddot{o}lderHolder不等式 3. Cauchy-Schwarz不等式 结论:任意两个向量的内积(点乘)的模平方,必定小于或等于这两个向量各自的模的乘积。 https://www.jianshu.com/p/77f9607d88d…

【渝粤题库】国家开放大学2021春1354高级英语阅读(2)题目

试卷代号:1354 2 0 2 1年春季学期期末统一考试 高级英语阅读(2) 试题 2021年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌子上。试卷和答题纸均不得带出考场。…