死锁

96 阅读2分钟

四个条件

  • 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。

  • 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。

  • 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。

  • 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。

预防死锁

  • 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
  • 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
  • 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
  • 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

避免死锁

  • 银行家算法

死锁实例

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(); } }