package com.qianfeng.demo02;
/**
* 出现死锁的四个必要条件:
* 1.互斥条件:资源不能互相共享,各用各的。
* 2.请求与保持条件:已经得到了资源的线程,还想要申请新的资源。
* 3.非剥夺条件:已经分配的资源不能在相应的线程中强行的剥夺。
* 4.循环等待条件:系统中若干个线程组成了环路,该环路中每一个线程都在等待着相邻的线程占据的资源。
*
* 分析:
* t0线程的对象应该执行if语句块当中的代码,t1线程的对象应该执行else语句块当中的代码,
* 正常来说四句话应该都被打印出来,但是也有可能出现死锁,原因是什么?
*
* 当t0持有了oa这个锁并且没有释放资源,这个时候cpu就切换到了另外一个线程t1上了,
* t1就持有了ob这个锁,因为t0的关系,t1就无法持有oa这个锁,就死锁了。
* */
public class DeadLockDemo02 {
public static void main(String[] args) {
Test a = new Test(true);
Test b = new Test(false);
Thread t0 = new Thread(a);
Thread t1 = new Thread(b);
t0.start();
t1.start();
}
}
class Test implements Runnable{
private boolean flag ;
public Test(boolean flag) {
this.flag = flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public boolean isFlag() {
return flag;
}
@Override
public void run() {
if (flag) {
while (true) {
synchronized (MyLock.oa) {
System.out.println("if...lockoa1");
synchronized (MyLock.ob) {
System.out.println("if...lockob1");
}
}
}
}else {
while (true) {
synchronized (MyLock.ob) {
System.out.println("if...lockob2");
//
synchronized (MyLock.oa) {
System.err.println("if...lockoa2");
}
}
}
}
}
}
class MyLock{
public static Object oa = new Object();
public static Object ob = new Object();
}
多线程——死锁产生的条件和过程分析
最新推荐文章于 2024-04-14 22:05:57 发布