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" + " 内层执行!"); } } }