死锁的演示

死锁

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

演示死锁

  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();
   }
}
相关推荐
superman超哥几秒前
仓颉元编程之魂:宏系统的设计哲学与深度实践
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉语言特性
一 乐1 分钟前
健身房预约|基于springboot + vue健身房预约小程序系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·小程序
CC.GG13 分钟前
【C++】哈希表的实现
java·c++·散列表
玄同76516 分钟前
Python 数据类型:LLM 语料与 API 参数的底层处理逻辑
开发语言·人工智能·python·自然语言处理·llm·nlp·知识图谱
Slow菜鸟21 分钟前
Java基础 | 布隆过滤器
java·开发语言
比奇堡派星星28 分钟前
Linux Hotplug 机制详解
linux·开发语言·驱动开发
molaifeng1 小时前
像搭积木一样理解 Golang AST
开发语言·后端·golang
SystickInt1 小时前
C语言 UTC时间转化为北京时间
c语言·开发语言
黎雁·泠崖1 小时前
C 语言动态内存管理进阶:常见错误排查 + 经典笔试题深度解析
c语言·开发语言
xixixiLucky1 小时前
IDEA中MAVEN项目找依赖的快捷插件
java·maven·intellij-idea