文章目录
死锁 - 写一个简单的死锁
1、什么是死锁
多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。
死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(Deadly-Embrace) ) ,若无外力作用,这些进程(线程)都将无法向前推进。
2、编写一个死锁
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** @author Created by 谭健 on 2019/11/14. 星期四. 11:12. © All Rights Reserved. */
public class MyThread extends Thread {
Lock firstLock, secondLock;
String name;
public MyThread(Lock firstLock, Lock secondLock, String name) {
this.firstLock = firstLock;
this.secondLock = secondLock;
this.name = name;
}
@Override
public void run() {
System.out.println(name + " started.");
firstLock.lock();
System.out.println(name + " almost done.");
secondLock.lock();
System.out.println(name + " finished.");
secondLock.unlock();
firstLock.unlock();
}
public static void main(String[] args) throws InterruptedException {
Lock lock1 = new ReentrantLock();
Lock lock2 = new ReentrantLock();
Lock lock3 = new ReentrantLock();
Thread thread1 = new MyThread(lock1, lock2, "Thread 1");
Thread thread2 = new MyThread(lock2, lock3, "Thread 2");
Thread thread3 = new MyThread(lock3, lock1, "Thread 3");
thread1.setName("Thread 1");
thread2.setName("Thread 2");
thread3.setName("Thread 3");
thread1.start();
thread2.start();
thread3.start();
}
}
如此,运行该程序,则极大概率进入死锁,并不是一定
3、分析
1、一般情况下,线程1 2 3 分别拿到锁1 2 3
2、然后线程1 尝试去拿锁2,锁2被线程2持有,线程1开始等待2
3、与此同时,线程2尝试拿锁3,锁3被线程3持有,线程2开始等待3
4、与此同时,线程3尝试拿锁1,锁1被线程1持有,线程3开始等待1
5、然后 1 = 2 , 2 = 3 , 3 = 1
6、就一直等,3把锁谁也不放,谁都想去争,于是发生死锁