文章目录
演示死锁的发生
- 演示死锁的发生
如下的代码演示了死锁的发生. 在run方法中, flag等于1 的时候, 线程1 ,获得了锁1, 需要拿到锁2 . flag等于2的时候, 线程2获得了锁2 ,需要拿到锁1, 创建两个线程的时候, 给线程1的flag赋值为1 , 线程2赋值为2.
这样创建线程, 启动线程的时候, 线程1 和2 分别拥有了锁1 和2 ,但是同时又需要拿到锁2和1 . 线程1和2也没有释放锁1和2. 这样就造成了相互等待锁资源,造成了死锁的发生.
package com.thread.background;
/**
* 类名称:DeadLockDemo
* 类描述: 线程安全问题,演示死锁。
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/1 7:22
* Version 1.0
*/
public class DeadLockDemo implements Runnable {
int flag = 1;
//两把锁
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
DeadLockDemo r1 = new DeadLockDemo();
DeadLockDemo r2 = new DeadLockDemo();
r1.flag=1;
r2.flag=2;
new Thread(r1,"thread1").start();
new Thread(r2,"thread2").start();
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+ " flag = " + flag);
if (flag == 1) {
//获取第一把锁
synchronized (o1) {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取第二把锁
synchronized (o2) {
System.out.println("1");
}
}
}
if (flag == 2) {
//获取第一把锁
synchronized (o2) {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取第二把锁
synchronized (o1) {
System.out.println("2");
}
}
}
}
}
运行程序可以看到线程1和2 分别进入run方法打印了输出语句之后, 就进入了死锁的阶段. 控制台的红色按钮一直亮着 ,说明程序一直在运行中, 发生了死锁.