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