本章主要讲述的是死锁的产生和必然产生死锁的代码。在Java中死锁,是指多个线程同时给阻塞,它们中的一个或者多个都在等待某一个资源释放。
死锁产生的四个必要条件
- 互斥使用:即当资源被一个线程使用(占用)时,另外的线程无法进行访问或者使用
- 不可抢占:即资源请求者请求资源时不能强制从资源占有者抢走资源,只能等待资源占有者自己释放资源。
- 请求和保持:资源请求者向外请求资源并保持已占有资源不释放。
- 循环等待:即存在一个等待循环队列,a要b的资源,b要a的资源。
必然产生死锁的代码
public class ThreadDead {
public static Object resources01 = new Object();
public static Object resources02 = new Object();
public static void main(String[] args) {
//经销商
new Thread(new Runnable() {
@Override
public void run() {
synchronized (resources01) {
System.out.println("线程1占用了资源1,开始请求资源2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resources02) {
System.out.println("线程1占用了资源1且占用了资源2");
}
}
}
}).start();
//客户
new Thread(new Runnable() {
@Override
public void run() {
synchronized (resources02) {
System.out.println("线程2占用了资源2,开始请求资源1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resources01) {
System.out.println("线程2占用了资源2且占用了资源1");
}
}
}
}).start();
}
}