package com.scwyfy.knowledge.juc; /** * Synchronized * 同步方法或者同步代碼塊 Synchronized 使用同一把鎖對象可實現:可重入鎖 */ public class SynchronizedRepeatLockDemo { public static void main(String[] args) { new SynchronizedLock().m1(); } } /** * javap -c SynchronizedLock.class 反編譯來解析synchronized可重入鎖原理 * synchronized通過monitor計數器實現 * 當執行monitorenter命令時: * 判斷當前monitor計數器值是否為0 * 如果為0,則說明當前線程可直接獲取當前鎖對象 * 如果不為0,判斷當前線程是否和獲取鎖對象線程是同一個線程 * 若是同一個線程,則monitor計數器累加1,當前線程能再次獲取到鎖 * 若不是同一個線程,則只能等待其它線程釋放鎖資源 * 當執行完synchronized鎖對象的代碼后,就會執行monitorexit命令, * 此時monitor計數器就減1,直至monitor計數器為0時,說明鎖被釋放了。 */ class SynchronizedLock { static Object lockB = new Object(); public void m1() { synchronized (lockB) { System.out.println(Thread.currentThread().getName() + "\t" + " 外層執行!"); m2(); } } public void m2() { synchronized (lockB) { System.out.println(Thread.currentThread().getName() + "\t" + " 中層執行!"); m3(); } } public void m3() { synchronized (lockB) { System.out.println(Thread.currentThread().getName() + "\t" + " 內層執行!"); } } }