1. 程式人生 > >Java多執行緒8:synchronized鎖重入

Java多執行緒8:synchronized鎖重入

synchronized方法/塊的內部呼叫本類的其他synchronized方法/時,是可得到鎖的。

關鍵字synchronized擁有鎖重入的功能,也就是在使用synchronized時,當一個執行緒的到一個物件鎖後,再次請求此物件鎖時是可以再次得到該物件的鎖的。

package unit2;

public class Demo5_shuochongru {
	public static void main(String[] args) {
		DemoThread thread = new DemoThread();
		thread.start();
	}
}

class Service {
	synchronized public void service1() {
		System.out.println("service1");
		service2();
	}

	synchronized private void service2() {
		System.out.println("service2");
		service3();
	}

	private void service3() {
		System.out.println("service3");
	}
}

class DemoThread extends Thread {
	
	public void run() {
		Service service = new Service();
		service.service1();
	}
}

在這裡插入圖片描述

子類物件可以通過“可重入鎖”呼叫父類的同步方法
package unit2;

public class Demo6_jicheng {
	public static void main(String[] args) {
		MyThread t = new MyThread();
		t.start();
	}
}

class Main {
	public int i = 10;
	synchronized public void operateMainMethod() {
		try {
			i--;
			System.out.println("main print i=" + i);
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class Sub extends Main {
	synchronized public void operateSubMethod() {
		try {
			while (i > 0) {
				i--;
				System.out.println("sub print i=" + i);
				Thread.sleep(100);
				this.operateMainMethod();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class MyThread extends Thread {
	public void run() {
		Sub sub = new Sub();
		sub.operateSubMethod();
	}
}

在這裡插入圖片描述

以上兩個例子證明了synchronized鎖重入,如果不能進行鎖重入則會產生死鎖,根本不會有結果輸出。