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

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对象的锁定,则直到线程A释放Integer锁定后,线程B才会继续进行,即使线程B持有字符串锁,线程A也不会被阻塞,因为现在线程B不会期望线程A释放整数锁可继续进行。

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

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

java中线程死锁及避免

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

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

相关文章

MySQL查询数据字典_存储过程_函数_视图元数据_表元数据_触发器

文章目录一、查询所有的存储过程二、查询某个数据库下的存储过程三、查询所有的函数四、查询某个数据库下的函数五、查看存储过程详情六、查看函数详情七、查看存储过程的创建源码八、查看函数的创建源码九、查看视图元数据十、查看表元数据十一、查看触发器一、查询所有的存储…

关键字高亮查询

1.1.1 需求分析 所谓高亮,就是使用特别的样式修饰某字段中包含的搜索关键字。 需求:实现搜索高亮,商品名称使用红色显示搜索关键字。 1.1.2实现思路 使用默认高亮显示来获取每个搜索命中title字段的高亮显示,在指定title字段的…

jep和jsr_JEP 342:JVM和幽灵

jep和jsrJEP 342 (“限制推测执行”)已从“ 草稿 ”状态转换为“ 候选 ”状态,但尚未针对特定的JDK版本(请参见图形以了解JEP流程中的步骤 )。 Jesper Wilhelmsson 写道 , JEP 342 “涵盖了使用新的C 编译器…

执行SQL脚本文件

文章目录一、登录数据库后,执行命令 source二、未登录数据库,执行命令 mysql一、登录数据库后,执行命令 source mysql> source /root/test/test.sql;二、未登录数据库,执行命令 mysql [roothtlwk0001host ~]# mysql -uroot -…

linux使jdk开机可用_JDK 11的一般可用性

linux使jdk开机可用按计划,这是今天宣布的是JDK 11被释放的通用性 。 本周初,Iris Clark宣布了“ JSR 384(Java SE 11)最终发行版 ”,并且在同一封邮件中引用了JSR 384的最终发行版,并引用了“ Java SE 11&…

实现搜索分页功能

1.1 需求分析 实现搜索分页功能,每页显示30条记录。实现商品列表下方分页栏。 1.2 实现思路 前端向后端传递参数 pageNo (页码) 1.3 代码实现 修改SearchServiceImpl的search方法,在第1段代码中添加代码 package com.changg…

MySQL的set names命令详解

执行下面的命令: mysql> set names charset_name;相当于执行了下面三条命令语句: mysql> SET character_set_client charset_name; mysql> SET character_set_results charset_name; mysql> SET character_set_connection charset_name…

aws ec2 跨帐号共享_AWS共享资源的警告

aws ec2 跨帐号共享最近,我一直在发布一个新版本,与往常一样,通过将DNS记录切换为指向以前的“备用”组的负载平衡器来利用蓝绿色部署 。 但是在切换DNS之前,我检查了新发布版本的日志并发现了一些奇怪的现象– Web框架&#xff0…

MySQL数据库模式_SQL模式

文章目录查看 MySQL 当前的 SQL 模式设置 MySQL 的 SQL 模式SQL 模式介绍TRADITIONAL(传统模式)STRICT(严格模式)ANSI 模式MySQL 服务器可以以不同的 SQL 模式来操作,并且可以为不同客户端应用不同模式。这样每个应用程…

spring http缓存_HTTP缓存与Spring示例

spring http缓存缓存是HTTP协议的强大功能,但由于某些原因,它主要用于静态资源,例如图像,CSS样式表或JavaScript文件。 但是,HTTP缓存不仅限于应用程序的资产,因为您还可以将其用于动态计算的资源。 只需少…

分类列表查询

1 需求分析 以关键字作为查询条件,查询结果中包含的商品分类,在页面中显示出来 2 实现思路 (1)商品分类列表的显示使用聚合查询 (2)使用过滤查询 3 代码实现 修改SearchServiceImpl的search方法&…

用户微服务-用户注册 发送短信验证码

1 需求分析 注册账号,用手机号注册,填写后发送短信验证码, 填写短信验证码正确方可注册成功。 2 实现思路 1)用户微服务生成6位的短信验证码,存入redis (以code_手机号为key),再发…

jdk 流合并_JDK 12,合并的收集器和命名的挑战

jdk 流合并看来可能是一种新的方法,将可在java.util.streams.Collectors类JDK 12即会,根据新方法的提出了基于Javadoc的文档,“返回一个收藏家是将输入的元素两个规定的收藏家并将其结果与指定的合并功能合并。” 目前 ,此新Colle…

MySQL配置变量log-bin,重启数据库服务失败

在配置文件 /etc/my.cnf 添加变量 log-bin: log-bin/var/lib/mysql/mybinlog/mysql-bin重启数据库服务报错: [roothtlwk0001host lib]# systemctl start mysqld.service Job for mysqld.service failed because the control process exited with error…

javafx 调用java_Java,JavaFX的流畅设计风格滑块

javafx 调用javaJMetro的Java,JavaFX主题版本刚刚提高到4.2版。 此版本为Slider控件带来了新样式。 除此之外,您现在还可以看到一个弹出窗口,向您显示滑块的当前值。 新滑块样式 以下是旧的JMetro Slider样式: 滑块OLD JMetro灯…

WebService入门介绍

参考文献: https://blog.csdn.net/cs_hnu_scw/article/details/80181762 创建服务器webService package com.william.TestWebService; import javax.jws.WebService; import javax.xml.ws.Endpoint;WebService public class MyFirstWebService {/*** 定义webservi…

手游建筑美术资源_建筑商和机械手

手游建筑美术资源下面是命名的OOP方法,这我想在我的代码遵循一个简单的原则:这是一个动词 ,如果它操纵 ,这是一个名词 ,如果它的基础之上 。 而已。 两者之间什么都没有。 诸如saveFile()或getTitle()不适合使用&#…

MySQL二进制日志文件的用法_数据恢复

文章目录开启二进制日志功能关闭/打开二进制日志记录刷新二进制日志文件查看二进制日志文件的存储位置利用二进制日志文件恢复数据的本质二进制日志提取/导出到脚本文件中查看当前二进制日志的最后一个位置查看二进制日志文件的内容执行 SQL 脚本文件以恢复数据二进制日志分析指…

启动weblogic需要账号密码问题

<Server is Running in Production Mode and Native Library(terminalio) to read the password securely from commandline is not found.> 解决方法 在weblogic路径下创建 \weblogic11\user_projects\domains\base_domain\servers\AdminServer\security 目录下创建bo…

mysqlbinlog: [ERROR] unknown variable ‘default-character-set=utf8mb4‘

错误提示&#xff1a; [roothtlwk0001host ~]# mysqlbinlog /var/lib/mysql/mybinlog/mysql-bin.000004 mysqlbinlog: [ERROR] unknown variable default-character-setutf8mb4原因&#xff1a; mysqlbinlog 这个工具无法识别 binlog 中的配置中的 default-character-setutf8m…