多线程09/线程死锁问题 柔情只为你懂 2023-10-04 16:39 9阅读 0赞 ### 线程死锁问题 ### > 死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续 > 解决方法 1. 专门的算法、原则 2. 尽量减少同步资源的定义 3. 尽量避免嵌套同步 -------------------- > 首先写一个出现死锁的概率极低的代码 package com.dxc; public class ThreadTest { public static void main(String[] args) { StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(); //该结构内有两把锁s1,s2 new Thread(){ public void run(){ //第一把锁 synchronized (s1){ s1.append("a"); s2.append("1"); //第二把锁 synchronized (s2){ s1.append("b"); s2.append("2"); System.out.println(s1); System.out.println(s2); } } } }.start(); //该结构内有两把锁s1,s2 new Thread(new Runnable() { @Override public void run() { //第一把锁(与上面线程顺序错开) synchronized (s2){ s1.append("c"); s2.append("3"); //第二把锁 synchronized (s1){ s1.append("d"); s2.append("4"); System.out.println(s1); System.out.println(s2); } } } }).start(); } } > 本次运行结果成功,无死锁 ![在这里插入图片描述][f4ecf5d83dab4df596dc4a6b36ffa506.png] > 下面增加sleep语句,提高出现死锁的概率 package com.dxc; public class ThreadTest { public static void main(String[] args) { StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(); //该结构内有两把锁s1,s2 new Thread(){ public void run(){ //第一把锁 synchronized (s1){ s1.append("a"); s2.append("1"); //增加死锁概率 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //第二把锁 synchronized (s2){ s1.append("b"); s2.append("2"); System.out.println(s1); System.out.println(s2); } } } }.start(); //该结构内有两把锁s1,s2 new Thread(new Runnable() { @Override public void run() { synchronized (s2){ s1.append("c"); s2.append("3"); //增加死锁概率 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (s1){ s1.append("d"); s2.append("4"); System.out.println(s1); System.out.println(s2); } } } }).start(); } } > 本次运行结果阻塞 > 因为上面线程拿到s1锁之后进行sleep,这时候系统时间片切换去执行下面的线程,下面的线程拿到s2锁后进行sleep,导致s1,s2两个锁都被占用,两个线程都无法进行下面的操作,出现死锁 ![在这里插入图片描述][b9e865ed96f74be184a68cff6a1c13b7.png] > 死锁的理解: > 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 说明: 1. 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续 2. 我们使用同步时,要避免出现死锁。 [死锁的练习题,直接看11:50][11_50] -------------------- [f4ecf5d83dab4df596dc4a6b36ffa506.png]: https://img-blog.csdnimg.cn/f4ecf5d83dab4df596dc4a6b36ffa506.png [b9e865ed96f74be184a68cff6a1c13b7.png]: https://img-blog.csdnimg.cn/b9e865ed96f74be184a68cff6a1c13b7.png [11_50]: https://www.bilibili.com/video/BV1Kb411W75N?p=438&spm_id_from=pageDriver
相关 Java多线程问题:线程同步与死锁 在Java多线程编程中,线程同步和死锁是两个关键概念。 1. 线程同步: - **synchronized关键字**:这是Java中最常用的同步机制。在一个方法或者代码 太过爱你忘了你带给我的痛/ 2024年09月10日 16:45/ 0 赞/ 29 阅读
相关 JAVA多线程—线程死锁 程死锁: 创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,... 妖狐艹你老母/ 2024年04月17日 22:29/ 0 赞/ 50 阅读
相关 多线程09/线程死锁问题 线程死锁问题 > 死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 出现死锁后,不会出现异常,不会出现提示,只 柔情只为你懂/ 2023年10月04日 16:39/ 0 赞/ 10 阅读
相关 多线程死锁 / 死锁:二个线程同时锁住一个变量时。 锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。 / 川长思鸟来/ 2022年07月15日 14:28/ 0 赞/ 281 阅读
相关 多线程-死锁 / 死锁:常见情景之一:同步的嵌套。 / class Ticket implements Runnable { pr 向右看齐/ 2022年06月02日 07:57/ 0 赞/ 262 阅读
相关 多线程死锁 峨眉山月半轮秋,影入平羌江水流 Java线程的死锁一直都是经典的多线程问题;因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都不能继续执行; 示例代码: た 入场券/ 2022年05月24日 04:09/ 0 赞/ 368 阅读
相关 多线程死锁 同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。这种情况能避免就避免掉。 雨点打透心脏的1/2处/ 2022年03月08日 07:50/ 0 赞/ 341 阅读
相关 多线程的死锁问题 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了死锁。 package com.sy.iodemo; pub 快来打我*/ 2022年01月29日 10:21/ 0 赞/ 356 阅读
还没有评论,来说两句吧...