四个条件
-
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
-
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
-
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
-
环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
预防死锁
- 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
- 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
- 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
- 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
避免死锁
- 银行家算法
死锁实例
public class JpsTest {
public static void main(String[] args) throws InterruptedException {
//创建资源
final Object a = new Object();
final Object b = new Object();
//启动线程
new Thread(new Runnable() {
@Override public void run() {
//获取a的锁
synchronized (a) {
try {
System.out.println("i'm t1");
//等待一会儿,确保下一个线程获得另一个资源对象锁 Thread.sleep(100);
//获取b的锁
synchronized (b) {
System.out.println("t1------");
}
} catch (InterruptedException e) {
e.printStackTrace(); } } } }).start();
//启动线程
new Thread(new Runnable() {
@Override public void run() {
//获取b的锁
synchronized (b) {
try {
System.out.println("i'm t2");
//等待一会儿,确保下一个线程获得另一个资源对象锁 Thread.sleep(100);
//获取a的锁
synchronized (a) {
System.out.println("t2------");
}
} catch (InterruptedException e) {
e.printStackTrace();
} } } }).start(); } }