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指令。