1、问题
1.1 产生的原因
系统有两个线程在跑,每个线程有两个锁,当线程一用了锁1,这个时候jvm调用线程二用了锁2,这个时候线程二不能打开锁1,程序就一直停在这里了
1.2 具体问题
有两个人Aman和Bman去执行刺杀任务,看成两个线程,老板那里只有一把匕首,要刺杀的只有一个人。Aman拿到了匕首,准备去接刺杀任务,但是任务却被Bman接了。Aman没有接刺杀任务,不能刺杀。Bman没有匕首,不能完成刺杀
1.3 解决办法
推荐不要用嵌套synchronized
2、代码
1 public class Demo { 2 public static void main(String[] args) { 3 String s1 = "匕首"; 4 String s2 = "刺杀"; 5 new Thread() { 6 7 @Override 8 public void run() { 9 while (true) { 10 synchronized (s1) { 11 System.out.println(this.getName() + "拿到匕首" + "准备刺杀"); 12 synchronized (s2) { 13 System.out.println(this.getName() + "正在刺杀"); 14 } 15 } 16 } 17 } 18 19 }.start(); 20 21 new Thread() { 22 23 @Override 24 public void run() { 25 while (true) { 26 synchronized (s2) { 27 System.out.println(this.getName() + "拿到匕首" + "准备刺杀"); 28 synchronized (s1) { 29 System.out.println(this.getName() + "正在刺杀"); 30 } 31 } 32 } 33 } 34 35 }.start(); 36 } 37 }
原文地址:https://www.cnblogs.com/Dbbf/p/9175174.html
时间: 2024-10-13 23:43:25