死锁的演示

死锁

当业务比较复杂时,多线程应用里有可能会发生死锁

演示死锁

  1. 线程一占有对象一,试图占有对象二
  2. 线程二占有对象二,试图占有对象一
  3. 线程一等待线程二释放线程二
  4. 线程二等待线程一释放线程一

练习

复制代码
package multiThread2;

public class main1 {
   public static void main(String[] args) {
       Animal a1 = new Animal();
       Animal a2 = new Animal();
       Animal a3 = new Animal();
       Thread t1 = new Thread(new Runnable() {
           @Override
           public void run() {
               synchronized (a1){
                   System.out.println("a1在做饭");
                   try {
                       Thread.sleep(1000);
                   }catch (Exception e){
                       throw new RuntimeException(e);
                   }
                   System.out.println("a1试图干饭");
                   System.out.println("a1等待着");
                   synchronized (a2){
                       System.out.println("a1 doing");
                   }
               }
           }
       });
       t1.start();
       Thread t2 = new Thread(new Runnable() {
           @Override
           public void run() {
               synchronized (a2){
                   System.out.println("a2在做饭");
                   try {
                       Thread.sleep(1000);
                   }catch (Exception e) {
                       throw new RuntimeException(e);
                   }
                   System.out.println("a2试图干饭");
                   System.out.println("a2等待着");
                   synchronized (a3){
                       System.out.println("a2 doing");
                   }
               }
           }
       });
       t2.start();
       Thread t3 = new Thread(new Runnable() {
           @Override
           public void run() {
               synchronized (a3){
                   System.out.println("a3在做饭");
               }
               try {
                   Thread.sleep(1000);
               }catch (Exception e){
                   throw new RuntimeException(e);
               }
               System.out.println("a3试图干饭");
               System.out.println("a3等待着");
               synchronized (a1){
                   System.out.println("a3 doing");
               }
           }
       });
       t3.start();
   }
}
相关推荐
卡尔特斯3 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源3 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole3 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫4 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide5 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261355 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源5 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
Java中文社群5 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心5 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧6 小时前
Spring Boot项目中如何自定义线程池
java