java死锁发生条件_Java 死锁以及死锁的产生

public class DeadLockSample {

public static void main(String[] args) {

DeadLock d1 = new DeadLock(true);

DeadLock d2 = new DeadLock(false);

d1.start();

d2.start();

}

}

class Lock {

/**

* 死锁定义 所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

* 死锁发生时的条件: *

* (1)互斥条件:一个资源每次只能被一个进程使用。独木桥每次只能通过一个人。 *

* (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。乙不退出桥面,甲也不退出桥面。 *

* (3)不剥夺条件: 进程已获得的资源,在未使用完之前,不能强行剥夺。甲不能强制乙退出桥面,乙也不能强制甲退出桥面。 *

* (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。如果乙不退出桥面,甲不能通过,甲不退出桥面,乙不能通过。

* 先看生活中的一个实例,两个人面对面过独木桥,甲和乙都已经在桥上走了一段距离,即占用了桥的资源,甲如果想通过独木桥的话,

* 乙必须退出桥面让出桥的资源,让甲通过,但是乙不服,为什么让我先退出去,我还想先过去呢,于是就僵持不下,导致谁也过不了桥,这就是死锁。

*

* 在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,

* 同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,

* 又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。

* 下面代码将产生死锁

*/

static Object obja = new Object();

static Object objb = new Object();

}

class DeadLock extends Thread {

private boolean flag;

DeadLock(boolean flag) {

this.flag = flag;

}

@Override

public void run() {

if (flag) {

synchronized (Lock.obja) {

System.out.println("if obja");

synchronized (Lock.objb) {

System.out.println("if objb");

}

}

} else {

synchronized (Lock.objb) {

System.out.println("else objb");

synchronized (Lock.obja) {

System.out.println("else obja");

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值