需求: 写几行代码, 实现线程死锁 ?
分析:
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 } }
