Java 代码模拟死锁

题目描述

Java代码模拟死锁

死锁条件

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

思路

  • 定义两个资源o1,o2
  • 对象deadLock1占有资源o1,需要资源o2
  • 对象deadLock2占有资源o2,需要资源o1
  • 死锁产生

代码

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);

        // deadLock2占用资源o1,准备获取资源o2
        if (flag == 1) {
            synchronized (o1) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("1");
                }
            }
        }

        // deadLock1占用资源o2,准备获取资源o1
        else if (flag == 0) {
            synchronized (o2) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println("0");
                }
            }
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏雪地二货笔记库

vue学习笔记9-监听属性-watch

这样就可以实现绑定 而且他后面也有很多功能,比如.lazy,惰性更新,只有焦点离开才会更新

9110
来自专栏java一日一条

熬夜并不值得程序员炫耀

放弃睡眠就像是高利贷借款。没错,看上去你是得到了额外的时间,但你想得太乐观了,你知道代价是什么吗?放高利贷的会回来讨债,到时如果你不能支付的话,他就会夺走你的创...

7610
来自专栏跟着阿笨一起玩NET

YYYY-mm-dd HH:MM:SS

87320
来自专栏跟着阿笨一起玩NET

Image.FromFile 锁文件的解决办法

7310
来自专栏java一日一条

作为一个程序员我最大的遗憾

20多年前我处在了人生的一个十字路口。随着我们用5年时间为出版社(他们希望进入新兴的互联网空间)打造的Deltagraph的终结,我的第二家公司逐渐走向没落。那...

8310
来自专栏java一日一条

自由程序员的3个开发技巧

我们有三个系列的小技巧要分享:与你的客户沟通,保护你的声誉以及解决常见的自由职业问题。下面让我们开始吧!

8510
来自专栏黄Java的地盘

《麦肯锡 问题分析与解决技巧》——阅读笔记(共16章)

《麦肯锡 问题分析与解决技巧》是一本关于问题分析与如何解决问题的书籍,在阅读过程中收获不少,因此留下读书笔记方便其他人来进行学习。

78710
来自专栏跟着阿笨一起玩NET

不允许对64位应用程序进行修改”的解决方法

在64位系统中使用VS对程序(32位的)进行调试,出现“不允许对64位应用程序进行修改”的提示,如下图所示:

13010
来自专栏java一日一条

一个 IT 青年北漂四年的感悟

工作这几年,每年都会有朋友离开北京,每次朋友跟我告别的时候总是让我有很多感慨,问自己什么时候回去。当初毕业来北京没想太多,只是出于对互联网的喜欢,而在老家又找不...

7820
来自专栏跟着阿笨一起玩NET

NULL不能和任何字段比较和运算

14210

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励