死锁的演示

死锁

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

演示死锁

  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();
   }
}
相关推荐
代码在改了2 分钟前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot
冷静 包容15 分钟前
C语言学习之 没有重复项数字的全排列
c语言·开发语言·学习
碳苯20 分钟前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
wclass-zhengge31 分钟前
数据结构篇(绪论)
java·数据结构·算法
何事驚慌32 分钟前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.33 分钟前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
学习使我变快乐34 分钟前
C++:静态成员
开发语言·c++
TJKFYY35 分钟前
Java.数据结构.HashSet
java·开发语言·数据结构
kylinxjd36 分钟前
spring boot发送邮件
java·spring boot·后端·发送email邮件
杰哥在此44 分钟前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程