JAVA面试点

2020 04 21

对于synchronized关键字而言,javac在编译时,会生成对应的monitorenter和monitorexit指令分别对应synchronized同步块的进入和退出,有两个monitorexit指令的原因是:为了保证抛异常的情况下也能释放锁,所以javac为同步代码块添加了一个隐式的try-finally,在finally中会调用monitorexit命令释放锁。使用synchronized执行同步代码块时首先要获得对象锁的监视器monitor机制,才能往下执行,否则就只能等待,而获取的过程又是互斥的,即同一时刻只要一个线程可以获取到。

而对于synchronized方法而言,javac为其生成了一个ACC_SYNCHRONIZED关键字,在JVM进行方法调用时,发现调用的方法被ACC_SYNCHRONIZED修饰,则会先尝试获得锁,JVM通过ACC_SYNCHRONIZED标识,就可以知道这是一个需要同步的方法。

偏向锁、轻量级锁、自旋锁、锁消除???

猜你喜欢

转载自www.cnblogs.com/wangby511/p/12751675.html
今日推荐