Java 1.6之前,synchronized是标准的重量级锁,多个线程竞争共享资源时,未竞争到资源的线程会一直处于阻塞状态,性能开销很大,同时对于重量级锁,对于加锁和释放锁也有很多的资源消耗。为了减少性能开销,提升效率,人们针对不同的加锁场景,细分了四种锁状态,包括无锁、偏向锁、轻量级锁,重量级锁,锁的状态会根据线程竞争资源的激烈程度从低到高不断更新。
很多时候,锁总是被同一线程屡次获取,并没有线程竞争锁。对于这样的情况,偏向锁就很适用,那究竟什么时候偏向锁呢?在第三章节,我们列出了在synchronized不同的锁状态下,Markword内存布局有很大的差异。
当一个线程去访问synchronized关键字修饰的代码块或者方法时,会在Markword中存储当前线程的ID,当再有线程想尝试进入同步块时,会先通过CAS比较当前Markword存储的线程ID能否为尝试进入同步块的线程ID,假如相等,不需要再次获取锁了,可直接执行同步代码块;假如不相等,说明当前偏向锁是偏向于其它线程,需要撤销偏向锁,而后将锁更新成轻量级锁。
撤销偏向锁并不是将锁真正的撤销,成为无锁的状态。对于偏向锁的撤销,对原持有的线程和锁本身有两种情况。
下面图演示在synchronized修饰的同步代码块下,线程T1和线程T2先后竞争锁资源的流程。
下一章谈谈轻量级和重量级锁。
PC中文正版 steam游戏 战争附言 Post Scriptum 联机游戏 国区激活码
DLC 似石族 Lithoids Species Pack 扩展包 资料片 steam平台 正版 群星 Stellaris 石头种族种群包 激活码
PC Steam正版游戏 大学城DLC 城市天际线 Cities: Skylines 国区激活码 秒发 cdk
PC Steam正版游戏 火车站DLC 城市天际线 Cities: Skylines 国区激活码 秒发 cdk
PC中文正版 steam游戏 新星漂移 Nova Drift 国区激活码 现货秒发
Steam PC正版 游戏 SimpleRockets 2 简单火箭2 全球key 激活码