Synchronized原理分析

简介: JUC学习

加锁和释放锁的原理

现象、时机(内置锁this)、深入JVM看字节码(反编译看monitor指令)

深入JVM看字节码,创建如下的代码:

public class SynchronizedDemo2 {
    Object object = new Object();
    public void method1() {
        synchronized (object) {
        }
        method2();
    }
    private static void method2() {
    }
}


使用javac命令进行编译生成.class文件

>javac SynchronizedDemo2.java


使用javap命令反编译查看.class文件的信息

>javap -verbose SynchronizedDemo2.class


得到如下的信息:

image.png

关注红色方框里的monitorentermonitorexit即可。

MonitorenterMonitorexit指令,会让对象在执行,使其锁计数器加1或者减1。每一个对象在同一时间只与一个monitor(锁)相关联,而一个monitor在同一时间只能被一个线程获得,一个对象在尝试获得与这个对象相关联的Monitor锁的所有权的时候,monitorenter指令会发生如下3中情况之一:

  • monitor计数器为0,意味着目前还没有被获得,那这个线程就会立刻获得然后把锁计数器+1,一旦+1,别的线程再想获取,就需要等待
  • 如果这个monitor已经拿到了这个锁的所有权,又重入了这把锁,那锁计数器就会累加,变成2,并且随着重入的次数,会一直累加
  • 这把锁已经被别的线程获取了,等待锁释放

monitorexit指令:释放对于monitor的所有权,释放过程很简单,就是讲monitor的计数器减1,如果减完以后,计数器不是0,则代表刚才是重入进来的,当前线程还继续持有这把锁的所有权,如果计数器变成0,则代表当前线程不再拥有该monitor的所有权,即释放锁。

下图表现了对象,对象监视器,同步队列以及执行线程状态之间的关系:

image.png

该图可以看出,任意线程对Object的访问,首先要获得Object的监视器,如果获取失败,该线程就进入同步状态,线程状态变为BLOCKED,当Object的监视器占有者释放后,在同步队列中得线程就会有机会重新获取该监视器。

目录
相关文章
|
6月前
|
Java
【多线程系列】你先说说synchronized的实现原理
面试官:听说你精通多线程,那我就考考你吧面试官:不用慌尽管说,错了也没关系😊。。。❤️。
【多线程系列】你先说说synchronized的实现原理
|
6月前
|
Java 编译器
synchronized原理
synchronized原理
|
6月前
|
存储 监控 安全
Synchronized 实现原理
Synchronized 实现原理
62 0
|
6月前
|
安全 Java
Java并发编程:Synchronized及其实现原理
Java并发编程:Synchronized及其实现原理
53 4
架构系列——通过ReentrantLock源码分析给对象上锁的原理
架构系列——通过ReentrantLock源码分析给对象上锁的原理
|
1月前
|
安全 Java
Synchronized是怎么实现的?
Synchronized是怎么实现的?
|
1月前
|
Java 编译器
synchronized 原理分析!
本文从字节码角度剖析`synchronized`关键字的工作原理,介绍其依赖的Java对象监视器锁机制,以及锁的获取、释放过程。文章还详细解释了偏向锁、轻量级锁等优化手段,并通过实例展示了同步方法和代码块的字节码实现。
35 0
|
3月前
|
存储 Java 开发者
synchronized源码分析解读
该文章主要探讨了Java中synchronized关键字的工作原理及其相关的源码分析,概括了synchronized关键字的基本概念、特性和其实现机制。通过源码分析进一步揭示了synchronized背后的运作原理。
|
5月前
|
存储 Java C++
Synchronized底层原理
Synchronized底层原理
|
存储 安全 Java
synchronized 的底层原理
synchronized 的底层是通过 Java 中的监视器锁(monitor)来实现的。每个 Java 对象都有一个与之对应的监视器锁,当一个线程获取了该对象的监视器锁,就可以执行 synchronized 代码块或方法。其他线程只能等待该线程释放锁,才能获取该对象的监视器锁并执行 synchronized 代码块或方法。
104 0
synchronized 的底层原理