1700451389
1700451390
}
1700451391
1700451392
public static void main(String args[]){
1700451393
1700451394
final A a=new A();
1700451395
1700451396
final B b=new B();
1700451397
1700451398
//线程A
1700451399
1700451400
new Thread(new Runnable(){
1700451401
1700451402
public void run(){
1700451403
1700451404
a.a1(b);
1700451405
1700451406
}
1700451407
1700451408
},“线程A”).start();
1700451409
1700451410
//线程B
1700451411
1700451412
new Thread(new Runnable(){
1700451413
1700451414
public void run(){
1700451415
1700451416
b.b1(a);
1700451417
1700451418
}
1700451419
1700451420
},“线程B”).start();
1700451421
1700451422
}
1700451423
1700451424
此段程序定义了两个资源A和B,然后在两个线程A、B中使用了该资源,由于两个资源之间有交互操作,并且都是同步方法,因此在线程A休眠1秒钟后,它会试图访问资源B的b2方法,但是线程B持有该类的锁,并同时在等待A线程释放其锁资源,所以此时就出现了两个线程在互相等待释放资源的情况,也就是死锁了,运行结果如下:
1700451425
1700451426
线程A进入A.a1()
1700451427
1700451428
线程B进入B.b1()
1700451429
1700451430
线程B试图访问A.a2()
1700451431
1700451432
线程A试图访问B.b2()
1700451433
1700451434
此种情况下,线程A和线程B会一直互等下去,直到有外界干扰为止,比如终止一个线程,或者某一线程自行放弃资源的争抢,否则这两个线程就始终处于死锁状态了。我们知道要达到线程死锁需要四个条件:
1700451435
1700451436
互斥条件:一个资源每次只能被一个线程使用。
1700451437
1700451438
资源独占条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
[
上一页 ]
[ :1.700451389e+09 ]
[
下一页 ]