锁结构升级为应对竞争激烈程度。基本synchronized代码通过monitorenter和monitorexit指令控制锁计数。每个对象同一时间只能关联一个monitor,同一时刻只有一个线程获取所有权。monitorenter指令将计数器加1,monitorexit指令减1,释放锁。对象、对象监视器、同步队列及执行线程间关系清晰。Mark Word相关字段说明:identity...
java锁结构之无锁&偏向锁&轻量级锁&重量级锁
对象由多部分构成:对象头、属性字段、补齐字段。补齐字段确保对象总大小为4字节的整数倍。对象头中,Klass word存放类地址,Mark Word包含对象hash值、年龄、hashcode、锁标志位等信息。使用JOL依赖可查看对象内容。
锁结构升级为应对竞争激烈程度。基本synchronized代码通过monitorenter和monitorexit指令控制锁计数。每个对象同一时间只能关联一个monitor,同一时刻只有一个线程获取所有权。monitorenter指令将计数器加1,monitorexit指令减1,释放锁。对象、对象监视器、同步队列及执行线程间关系清晰。
Mark Word相关字段说明:identity_hashcode延迟加载对象标识hashcode,age记录对象年龄,用于GC判断是否晋升老年代。biased_lock表示对象是否启用偏向锁。lock状态位表示锁状态。thread和epoch标识偏向锁,ptr_to_lock_record和ptr_to_heavyweight_monitor指向栈和监视器。
synchronized锁真实名称为重量级锁。为提高效率,JVM按顺序实现锁升级:无锁到偏向锁,偏向锁到轻量级锁,轻量级锁到重量级锁。锁升级依据线程竞争情况,轻量级锁为公平锁,重量级锁用于高安全场景。
无锁结构适用于无多线程共享全局变量的业务。偏向锁适用于单线程访问共享变量的场景。轻量级锁适用于多线程竞争锁资源的场景,如秒杀活动。重量级锁用于对全局变量访问具有最高安全性的金融系统等。2024-10-18