Synchronized 相关问题
-
我们都常用Synchronized,但是它的其原理是什么呢?这个问题在JAVA的面试中是一道必问的题,而一些没有写过任何并发程序的开发者就会没听说或者没接触过Synchronized。
Synchronized是基于JVM虚拟机实现的一种实现互斥同步的一种方式,如果你去查看被Synchronized修饰过的程序块,或者由Synchronzed编译过的字节码,你就会发现被 Synchronized 修饰过的程序块,在编译前后被编译器生成了monitorenter 和 monitorexit 两个字节码指令。
那么这两个指令是什么意思呢?在虚拟机执行到 monitorenter 指令时,首先要尝试着获取到对象的锁:如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器自增一;当执行 monitorexit 指令时将锁计数器自减一;当计数器为 0 时,那么锁就会被释放了。
如果获取对象失败了,那当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。
Java 中 Synchronize 通过在对象头设置标记,达到了获取锁和释放锁的目的。
那么什么是可重入性,为什么说 Synchronized 是可重入锁呢?
可重入性是锁的一个基本要求,是为了解决自己锁死自己的情况。
一个类中的同步方法调用另一个同步方法 对 Synchronized 来说,可重入性是显而易见的,之前提到的,在执行 monitorenter 指令时,如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,就把锁的计数器自增一,其实本质上就通过这种方式实现了可重入性。
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏