java 22 - 15 死锁的问题

 同步的弊端:
   A:效率低
   B:容易产生死锁

 死锁:
   两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象。

 举例:
  中国人,美国人一起吃饭。
 正常情况:
  中国人:筷子两支
   美国人:刀和叉
 死锁时:
    中国人:筷子1支,刀一把
  美国人:筷子1支,叉一把

 

首先创建一个死锁的类

1 public class MyLock {
2     // 创建两把锁对象
3     public static final Object objA = new Object();
4     public static final Object objB = new Object();
5 }

 

 1 public class DieLock extends Thread {
 2 
 3     private boolean flag;
 4     //自定义标签
 5     public DieLock(boolean flag) {
 6         this.flag = flag;
 7     }
 8 
 9     @Override
10     public void run() {
11         if (flag) {
12             synchronized (MyLock.objA) {
13                 System.out.println("if objA");
14                 synchronized (MyLock.objB) {
15                     System.out.println("if objB");
16                 }
17             }
18         } else {
19             synchronized (MyLock.objB) {
20                 System.out.println("else objB");
21                 synchronized (MyLock.objA) {
22                     System.out.println("else objA");
23                 }
24             }
25         }
26     }
27 }

 

1 public class DieLockDemo {
2     public static void main(String[] args) {
3         DieLock dl1 = new DieLock(true);
4         DieLock dl2 = new DieLock(false);
5 
6         dl1.start();
7         dl2.start();
8     }
9 }

 

程序执行的理想结果是:

  if objA

  if objB

  else objB

  else objA

但,由于死锁的原因:

例子  flag = true; 时,进去执行if objA,

    而这个时候,可能flag = false;抢到了cpu的资源,就强制运行

      else objB。这个时候,就陷入了死锁状态。

    两个线程谁都动不了,因为各自的钥匙都在对方的手上。

posted @ 2016-10-10 20:19  卡拉瓦  阅读(260)  评论(0编辑  收藏  举报