Java多執行緒8:synchronized鎖重入
阿新 • • 發佈:2018-12-12
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鎖重入,如果不能進行鎖重入則會產生死鎖,根本不會有結果輸出。