线程同步——死锁问题

Posted dbbf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程同步——死锁问题相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于线程同步——死锁问题的主要内容,如果未能解决你的问题,请参考以下文章

Java中线程死锁问题

Java_线程同步和死锁

线程同步

同步函数死锁现象

Java多线程:线程同步详解

线程同步死锁