死鎖問題的描述和代碼展現
同步弊端:效率低;如果出現了同步嵌套,就容易産生死鎖問題。
死鎖問題:是指兩個或者兩個以上的線程在執行的過程中,因争奪資源産生的一種互相等待現象。
同步代碼塊的嵌套案例代碼如下:
1 package cn.itcast_02;
2
3 public class MyLock {
4 // 建立兩把鎖對象
5 public static final Object objA = new Object();
6 public static final Object objB = new Object();
7 }
1 package cn.itcast_02;
2
3 public class DieLock extends Thread {
4
5 private boolean flag;
6
7 public DieLock(boolean flag) {
8 this.flag = flag;
9 }
10
11 @Override
12 public void run() {
13 if (flag) {
14 synchronized (MyLock.objA) {
15 System.out.println("if objA");
16 synchronized (MyLock.objB) {
17 System.out.println("if objB");
18 }
19 }
20 } else {
21 synchronized (MyLock.objB) {
22 System.out.println("else objB");
23 synchronized (MyLock.objA) {
24 System.out.println("else objA");
25 }
26 }
27 }
28 }
29
30 }
1 package cn.itcast_02;
2
3 /*
4 * 同步的弊端:
5 * A:效率低
6 * B:如果出現了同步嵌套,就容易産生死鎖問題
7 *
8 * 死鎖:
9 * 是指兩個或者兩個以上的線程在執行的過程中,因争奪資源産生的一種互相等待現象。
10 *
11 * 舉例:
12 * 中國人和美國人一起吃飯案例。
13 * 正常情況:
14 * 中國人:筷子兩支
15 * 美國人:刀和叉
16 * 現在:
17 * 中國人:筷子1支,刀一把
18 * 美國人:筷子1支,叉一把
19 */
20 public class DieLockDemo {
21 public static void main(String[] args) {
22 DieLock dl1 = new DieLock(true);
23 DieLock dl2 = new DieLock(false);
24
25 dl1.start();
26 dl2.start();
27 }
28 }
理想情況下程式的運作結果為:
if objA
if objB
else objB
else objA
或者
else objB
else objA
if objA
if objB
死鎖情況下程式的運作結果為:
if objA
else objB
或者
else objB
if objA
這四種程式運作結果都有可能發生!
我的GitHub位址:
https://github.com/heizemingjun我的部落格園位址:
http://www.cnblogs.com/chenmingjun我的螞蟻筆記部落格位址:
http://blog.leanote.com/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】