java: 写出优雅的--线程死锁案例

xiaoxiao2021-02-28  49

需求: 写几行代码, 实现线程死锁  ?

分析: 

1, 需要写几个线程? ( 单个线程, 无法和别人竞争锁, 不存在死锁的情况)

======= 所以:    最少要写2个线程

2,  创建什么锁?   创建几个锁? 

 ( java中, 一切对象都是锁(除了null),   但是同一个锁只会让人排着队依依等待, 那叫同步!  )

( 所谓多个线程, 和别人竞争锁,   意思就是:   抢别人的锁 && 别人占用的锁不给你)

========所以:   创建不同的两个对象作为锁  

3,  如何实现:   抢别人的锁 && 别人占用的锁不给你?  ===>你抢的是我的锁 && 我抢的是你的锁

======== 于是:   互斥=====>死锁!

下面是具体代码实现, 先来初级版

/** * 死锁的锁---任意两个 && 不同(常量)对象 * * @author wang * */ public class DeadLock1 { public static void main(String[] args) { new Thread() {@Override//创建线程1 && 加锁 public void run() { //线程体 synchronized ("a") { System.out.println("t1 got a ...and goning to get b.."); new Scanner(System.in).next();//io阻塞: 延长线程生命周期 synchronized ("b") { System.out.println("t1 got a + b..."); } } }}.start(); new Thread() {@Override//创建线程2 && 加锁 public void run() { //线程体 synchronized ("b") { System.out.println("t2 got b ...and goning to get a.."); new Scanner(System.in).next();//io阻塞: 延长线程生命周期 synchronized ("a") { System.out.println("t2 got a + b..."); } } }}.start(); } }

不知大家是否注意到刚开始就提出的死锁的条件,第一条==>两个以上的线程 ?

而我们知道main方法本身就是一个线程,所以再来升级版"线程死锁"

public class DeadLock { public static void main(String[] args) { new Thread() {//创建新线程 public void run() { synchronized ("b") { System.out.println(Thread.currentThread().getName() + "--get b"); new Scanner(System.in).next(); synchronized ("a") { System.out.println(Thread.currentThread().getName() + "--get a+b"); } } } }.start(); synchronized ("a") {//main线程 System.out.println(Thread.currentThread().getName() + "--get a"); new Scanner(System.in).next(); synchronized ("b") { System.out.println(Thread.currentThread().getName() + "--get a+b"); } }//syn } }

 

转载请注明原文地址: https://www.6miu.com/read-2627824.html

最新回复(0)