java Lock lock 模擬死鎖

synchronized 來講,要模擬死鎖,網上確定不少例子,並且也比較實現。 但是 Lock 類 怎麼纔會死鎖呢? 怎麼用呢? 發現就比較少例子了。並且 好多代碼哦, 看起來 好難看挺亂的。 我就 本身 嘗試着實現,寫的時候還一度把我頭腦搞暈了,亂寫巧合 實現了,還算比較簡單。java

package com.mytest.code_right.sys_lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test6 {

	public static void main(String args[]) {
		// 線程死鎖

		final A a = new A();

		final B b = new B();

		// 線程A

		new Thread(new Runnable() {

			public void run() {
				System.out.println("線程A開始執行");
				a.a3(b);

			}

		}, "線程A").start();

		// 線程B

		new Thread(new Runnable() {

			public void run() {
				System.out.println("線程B開始執行");
				b.b3(a);

			}

		}, "線程B").start();

	}


	// 資源A

	static class A {

		private final Lock lock = new ReentrantLock();

		public void a2() {
			System.out.println("未加鎖進入a.a2()" + Thread.currentThread().getName());
			lock.lock();
			System.out.println("進入a.a2()");
			lock.unlock();
		}

		public void a3(B b) {
			System.out.println("進入a3開始鎖" + Thread.currentThread().getName());
			lock.lock();
			System.out.println("進入a3鎖" + Thread.currentThread().getName());

			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			System.out.println("進入a3鎖>>開始執行b.b2" + Thread.currentThread().getName());
			b.b2();
			lock.unlock();


		}

	}

	// 資源B

	static class B {

		private final Lock lock = new ReentrantLock();

		public void b2() {
			System.out.println("未加鎖進入b.b2()" + Thread.currentThread().getName());
			lock.lock();
			System.out.println("進入 b.b2");
			lock.unlock();
		}

		public void b3(A a) {
			System.out.println("進入b3開始鎖" + Thread.currentThread().getName());
			lock.lock();
			System.out.println("進入b3鎖" + Thread.currentThread().getName());

			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			System.out.println("進入b3鎖>>開始執行a.a2" + Thread.currentThread().getName());
			a.a2();
			lock.unlock();

		}

	}

}

其實以上的例子是參考多線程

編寫高質量代碼:改善Java程序的151個建議-秦小波線程

裏面的一些 Lock和synchronized 例子來 寫的。code

總結

其實我寫出來的時候才發現本身對 Lock 理解不對, 看着代碼分析才理解了 書上的意思對象

這是由於對於同步資源來講(示例中是代碼塊),顯式鎖是對象級別的鎖,而內部鎖是類級別的鎖,也就是說Lock鎖是跟隨對象的,synchronized鎖是跟隨類的,更簡單地說把Lock定義爲多線程類的私有屬性是起不到資源互斥做用的,除非是把Lock定義爲全部線程的共享變量。

也就是說 Lock 是對象級別的鎖 ,會鎖着對象。資源

###代碼例子說明 上面的例子 死鎖的緣由是這樣: 線程B 鎖着 類B 而後想獲取 類A的方法鎖着並執行所以須要鎖着對象A , 線程A鎖着 類A ,想獲取類B的方法鎖着並執行所以須要鎖着對象B , 所以它們就會互相等待,死鎖了。 若是把上面的代碼 的 thread.sleep 時間去掉,執行多幾回,就會發現有時候是不會出現 線程死鎖的。 這就是 線程A 先執行完,而後到線程B 執行的不會等待了。get

相關文章
相關標籤/搜索