同步的弊端:
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。这个时候,就陷入了死锁状态。
两个线程谁都动不了,因为各自的钥匙都在对方的手上。