美文网首页多线程与并发
Java Synchronized原理是什么?Synchroni

Java Synchronized原理是什么?Synchroni

作者: 播妞小可爱 | 来源:发表于2021-01-04 13:45 被阅读0次

    Synchronized原理是Java面试中几乎百分百会问到的问题,因为没有任何写过并发程序的开发者会没听说或者没接触过Synchronized。

    Synchronized是由JVM实现的一种实现互斥同步的一种方式,如果你查看被Synchronized修饰过的程序块编译后的字节码,会发现,被Synchronized修饰过的程序块,在编译前后被编译器生成了monitorenter和monitorexit两个字节码指令。

    这两个指令是什么意思呢?在虛拟机执行到monitorenter指令时,首先要尝试获取对象的锁:如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器+1;当执行 monitorexit指令时将锁计数器-1;当计数器为O时,锁就被释放了。如果获取对象失败了,那当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。Java中Synchronize通过在对象头设置标记,达到了获取锁和释放锁的目的。

    “锁”的本质其实是monitorenter和monitorexit字节码指令的一个Reference类型的参数,即要锁定和解锁的对象。我们知道,使用Synchronized可以修饰不同的对象,因此,对应的对象锁可以这么确定。

    1. 如果Synchronized明确指定了锁对象,比如Synchronized(变量名)、Synchronized(this)等,说明加解锁对象为该对象。

    2. 如果没有明确指定:

    若Synchronized修饰的方法为非静态方法,表示此方法对应的对象为锁对象;

    若Synchronized修饰的方法为静态方法,则表示此方法对应的类对象为锁对象;

    注意,当一个对象被锁住时,对象里面所有用Synchronized修饰的方法都将产生堵塞,而对象里非Synchronized修饰的方法可正常被调用,不受锁影响。

    相关文章

      网友评论

        本文标题:Java Synchronized原理是什么?Synchroni

        本文链接:https://www.haomeiwen.com/subject/qqcvoktx.html