先简单说下普通对象内存分布

锁升级过程:
无锁态-偏向锁-轻量锁-重量锁
1个字节等于8个比特(1Byte=8bit) 位(bit)


偏向锁:记录上次线程指针,用54位
若有其它线程竞争升级轻量锁,各自线程栈生成LockRecord,拿它去抢锁,自选方式CAS抢;
轻量锁:指向线程栈中的LockRecord的指针 用62位
1.6之前竞争再加剧,有线程超过10次自旋 -XX:PreBlockSpin可设置,或者自旋线程超过一半,1.6后由JVM自适应
升级重量锁:向操作系统申请资源,拿不到锁的线程挂起,进入等待队列WaitSet(不消耗资源),等待系统调度(CFS完全公平策略)。
字节码 monitorenter monitorexit
锁重入:
重入次数记录:用于加锁,重入,解锁记录
偏向锁:在线程——》栈中 LockRecord + 1个LockRecord
轻量级:类似也是 LockRecord + 1个
重量级:会记录在ObjectMonitor的字段上
happen-before原则 :如果A happens-before B,则A的执行结果对B可见,并且A的执行顺序先于B。线程A先对共享变量A进行加一,由happens-before关系可知线程A的执行结果对线程B可见即线程B所读取到的a的值为1。
锁消除

网友评论