手写一个死锁的程序
package com.study.juc.map;
/**
* Created by Administrator on 2019/3/25.
*/
public class DeaLock implements Runnable {
public static Object oj1 = new Object();
public static Object obj2 = new Object();
public boolean flag =false;
@Override
public void run() {
if (flag){
synchronized (oj1){
System.out.println("线程thread拿到锁t0");
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2){
System.out.println("线程之间并没有产生死锁thread---------1");
}
}
}else {
synchronized (obj2){
System.out.println("线程thread1拿到锁t1");
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (oj1){
System.out.println("线程之间并没有产生死锁thread1-----------2");
}
}
}
}
public static void main(String[] args) {
DeaLock deaLock = new DeaLock();
DeaLock deaLock1 = new DeaLock();
deaLock.flag =false;
deaLock1.flag = true;
Thread thread = new Thread(deaLock);
Thread thread1 = new Thread(deaLock1);
thread.start();
thread1.start();
}
}
首先我们需要理解一下死锁的概念,多个并发进程因争夺系统资源而产生相互等待的现象。意思说造成死锁的原因我们可以理解为,当有两个线程在使用同一个共享资源的时候,在为了保证线程安全的情况下我们通常为加一把同步锁,此时就产生问题了,如代码所示,当tread获得共享对象oj1的锁以及tread1获得obj2的锁,而tread获取完锁后又要去获取obj2的锁因此会去等待tread1去释放obj2锁,而tread1又要去获取oj1的锁,此时两个线程都进入相互等待的情况,所以产生了死锁的问题。
以上是笔者通过一个简单死锁程序大概介绍了产生死锁的原因,大家可以通过程序演示一下死锁的过程,加深自己的印象,有问题欢迎加笔者微信进行讨论。
VX:549896196