Java代码模拟死锁 多线程

来源:互联网 发布:淘宝延时喷剂是真的吗 编辑:程序博客网 时间:2024/05/22 17:34

题目描述

Java代码模拟死锁

死锁条件

  1. 互斥使用:一个资源只能分配给一个线程
  2. 不可剥夺:资源只能由占有者释放,申请者不能强制剥夺
  3. 请求保持:线程申请资源时,保持对原有资源的占有
  4. 循环等待:存在一个进程等待队列:{P1 , P2 , … , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路

代码

public class DeadLock implements Runnable {    // flag=1,占有对象o1,等待对象o2    // flag=0,占有对象o2,等待对象o1    public int flag = 1;    // 定义两个Object对象,模拟两个线程占有的资源    public static Object o1 = new Object();    public static Object o2 = new Object();    public static void main(String[] args) {        DeadLock deadLock1 = new DeadLock();        DeadLock deadLock2 = new DeadLock();        deadLock1.flag = 0;        deadLock2.flag = 1;        Thread thread1 = new Thread(deadLock1);        Thread thread2 = new Thread(deadLock2);        thread1.start();        thread2.start();    }    public void run() {        System.out.println("flag: " + flag);        if (flag == 1) {            synchronized (o1) {                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                synchronized (o2) {                    System.out.println("1");                }            }        } else if (flag == 0) {            synchronized (o2) {                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                synchronized (o1) {                    System.out.println("0");                }            }        }    }}
1 0