Java 代码模拟死锁

作者: 被称为L的男人 | 来源:发表于2017-08-06 16:17 被阅读169次

题目描述

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

相关文章

  • Java 代码模拟死锁

    题目描述 Java代码模拟死锁 死锁条件 互斥使用:一个资源只能分配给一个线程 不可剥夺:资源只能由占有者释放,申...

  • Java 代码模拟死锁

    题目描述 Java代码模拟死锁 死锁条件 互斥使用:一个资源只能分配给一个线程 不可剥夺:资源只能由占有者释放,申...

  • jstack找到java死锁线程信息

    首先熟悉一下jstack命令的用法,如下图: 编写模拟死锁的java代码,如下: 使用jps找到执行代码的进程ID...

  • java死锁问题排查

    首先熟悉一下jstack命令的用法,主要参数有-F -l -m 如下图: 模拟一段死锁的java代码,如下: ``...

  • java笔记——通过例子理解死锁的定义

    通过例子理解死锁的定义 代码:Deadlock.java DeadlockTest.java (2)代码:Dead...

  • JVM_JMM: 死锁的检测

    死锁的示例代码: 通过jconsole来检测死锁: 名称: Thread-1状态: java.lang.Class...

  • Java 死锁代码

    username = ausername = b

  • Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁。 代码如下:Program.java...

  • Java模拟post请求上传文件

    Java模拟post请求上传文件 Java代码实现/** * 模拟文件post上传 * @para...

  • 多线程分析——死锁代码demo

    前言 本文主要是对Java多线程死锁代码demo的分析,对其过程以及死锁进行了大致的概括,希望对大家有帮助。 死锁...

网友评论

    本文标题:Java 代码模拟死锁

    本文链接:https://www.haomeiwen.com/subject/zvxnlxtx.html