死锁的演示

死锁

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

演示死锁

  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();
   }
}
相关推荐
冯汉栩10 小时前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng11 小时前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
qq_1851986911 小时前
SpringBoot-五-AOT
java·spring boot·后端
王大大的刀11 小时前
Spring AI 重试引起的 LLM 重复调用
java·人工智能
oh,huoyuyan11 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年11 小时前
hutool
java·服务器·开发语言
H_oRIZoN_12 小时前
Linux入门DAY27(文件IO(系统调用)详解|open/read/write/lseek)
java·linux·服务器
延凡科技12 小时前
从 “人管机器“ 到 “数据管人“:智慧矿山综合管控落地实践
java·后端·struts
一木 之林12 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao12 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang