打字猴:1.700451389e+09
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 ]  [ 下一页 ]