⼀个简单的死锁代码#
public class DeadLock{
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
synchronized (o1) {
System.out.println("线程1锁o1");
一个线程可以包含多个进程
try {
Thread.sleep(1000);//让当前线程睡眠,保证让另⼀线程得到o2,防⽌这个线程启动⼀下连续获得o1和o2两个对象的锁。
synchronized (o2) {
System.out.println("线程1锁o2");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
public void run() {
synchronized (o2) {
System.out.println("线程2锁o2");
synchronized (o1) {
System.out.println("线程2锁o1");
}
}
}
}).start();
}
}
什么是死锁
死锁,是指多个线程在运⾏过程中因争夺资源⽽造成的⼀种僵局,若⽆外⼒作⽤,它们都将⽆法再向前推进。
死锁的4个必要条件
互斥条件:⼀个资源每次只能被⼀个线程使⽤;
请求与保持条件:⼀个线程因请求资源⽽阻塞时,对已获得的资源保持不放;
不剥夺条件:进程已经获得的资源,在未使⽤完之前,不能强⾏剥夺;
循环等待条件:若⼲线程之间形成⼀种头尾相接的循环等待资源关系。
如何避免(预防)死锁
破坏“请求和保持”条件:让进程在申请资源时,⼀次性申请所有需要⽤到的资源,不要⼀次⼀次来申请,当申请的资源有⼀些没空,那就让线程等待。不过这个⽅法⽐较浪费资源,进程可能经常处于饥饿状态。还有⼀种⽅法是,要求进程在申请资源前,要释放⾃⼰拥有的资源。
破坏“不可抢占”条件:允许进程进⾏抢占,⽅法⼀:如果去抢资源,被拒绝,就释放⾃⼰的资源。⽅法⼆:操作系统允许抢,只要你优先级⼤,可以抢到。
破坏“循环等待”条件:将系统中的所有资源统⼀编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序提出(指定获取锁的顺序,顺序加锁)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。