synchronized底层实现的简单描述

321 阅读2分钟

1:synchronized作用

1.1:保证语句块内操作的原子性
1.2:通过‘在执行unlock之前,必须先把此变量同步回主内存’实现可见性
1.3:保证有序性

2:synchronized的使用

1.1:修饰实例方法
1.2:修饰静态方法
1.3:修饰s代码块,对ynchronized括号内的对象加锁

3:实现原理

1.1:jvm基于进入和退出Monitor对象来实现方法同步和代码块同步
	a.方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之
    中。JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 
    ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时,调用指令将会 检
    查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有
    monitor(虚拟机规范中用的是管程一词), 然后再执行方法,最后再方法完成(无论是正
    常完成还是非正常完成)时释放monitor。
    b.代码块的同步是利用monitorenter和monitorexit这两个字节码指令。它们分别位于同步
    代码块的开始和结束位置。每个对象有一个监视器锁(monitor)。当monitor被占用时就会
    处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:
    1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为
    monitor的所有者。
    2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
    3、如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,
    再重新尝试获取monitor的所有权。
   

源自:https://blog.csdn.net/weixin_38481963/article/details/88384493
我们看到对于同步方法,反编译后得到ACC_SYNCHRONIZED 标志,对于同步代码块反编译后得到
monitorenter和monitorexit指令。