synchronized实现解析

Posted 水田如雅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized实现解析相关的知识,希望对你有一定的参考价值。

JVM层的实现

对于代码:

 int dataV = 1;

    public synchronized void changeData() 
        dataV++;
    

    public void readData() 
        synchronized (this) 
            System.out.println(dataV);
        
    

同步代码块

首先来看代码块方法readData反编译之后:

对于同步代码快,反编译之后会生成成对的monitorentermonitorexit。在执行monitorenter指令的时候,首先尝试获取对象的锁,如果这个锁没有被锁定或者当前线程已经拥有了那个对象的锁,锁的计数器就加1,在执行monitorexit指令时会将锁的计数器减1,当减为0的时候就释放锁。如果获取对象锁一直失败,那当前线程就要阻塞等待,直到对象锁被另一个线程释放为止。

同步方法

对于同步方法,反编译之后,发现多出来ACC_SYNCHRONIZED
当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体,方法执行完后再释放monitor。在方法执行期间,其他任何线程都无法再获得同一个monitor对象。

以上是关于synchronized实现解析的主要内容,如果未能解决你的问题,请参考以下文章

synchronized实现解析

Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析

?Synchronized底层实现---偏向锁

从三个层面解析synchronized原理

synchronized互斥锁实例解析

多线程 Thread 线程同步 synchronized