Java锁的机制 - synchronized优化
在Java中,synchronized的底层原理是通过monitorenter和monitorexit来实现的。monitor可以想象成只能容纳一位客人的房间,每一个线程相当于一个客人,如果房间里面有一个客人,那么其他客人(线程·)就需要在房间外面等待。
在java1.6之后,进行了大量优化,其中对象有四种状态:无锁、偏向锁、轻量级锁、重量级锁。
对象头存放的Mark Word 32bit 和Class 指针。Mard Work中最后2bit表明这个对象什么状态。01的话,需要看倒数第3bit是否为0,如果为0,则是无锁状态。如果为1,则是偏向锁状态。最后两位为00,为轻量级锁状态,为10,为重量级锁状态。偏向锁状态是,前23bit存放的是当前线程的id值。轻量级锁状态,29bit存放的指向栈中锁记录的指针。该栈在虚拟机栈中开辟的lock record内存区域。栈帧中存放有指向这个对象的引用。重量级锁状态,前29bit存放的是指向重量级锁的指针。
自旋锁: 当升级为轻量级锁时,其他想要申请锁的线程需要进行自旋判断,一般次数为10次,当有两个以上的线程申请这个锁的时候,轻量级锁会升级为重量级锁。但上个一锁成功之后,自旋锁也会坚持更长时间的自旋,因为上一次申请成功,这叫做适应性自旋锁。
自适应意味着自旋的时间(次数)不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。. 如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。. 如果对于某个锁,自旋很少成功获得过,那在以后尝试获取这个锁时将可能省略掉自旋过程,直接阻塞线程,避免浪费处理器资源。--转载https://www.xttblog.com/?p=3391

浙公网安备 33010602011771号