Java锁升级过程
所属分类 java
浏览量 766
一、锁种类
偏向锁
大多数时候不存在锁竞争,一个线程多次获得同一个锁
轻量级锁
轻量级锁考虑的是竞争锁对象的线程不多,而且线程持有锁的时间也不长的情景
因为阻塞线程需要CPU从用户态转到内核态,代价较大,
如果刚刚阻塞不久这个锁就被释放了,那这个代价就有点得不偿失了,
因此这个时候就干脆不阻塞这个线程,让它自旋这等待锁释放。
自旋锁
减少线程上下文切换,提高执行效率
重量级锁
除拥有锁的线程外阻塞所有竞争线程
二、具体过程
线程A在进入同步代码块前,先检查MarkWord中的线程ID是否与当前线程ID一致,
如果一致(还是线程A获取锁对象),则无需使用CAS来加锁、解锁。
如果不一致,再检查是否为偏向锁,如果不是,则自旋等待锁释放。
如果是,再检查该线程是否存在(偏向锁不会主动释放锁),
如果不在,则设置线程ID为线程A的ID,此时依然是偏向锁。
如果还在,则暂停该线程,同时将锁标志位设置为00即轻量级锁
(将MarkWord复制到该线程的栈帧中并将MarkWord设置为栈帧中锁记录)
线程A自旋等待锁释放。
如果自旋次数到了该线程还没有释放锁,
或者该线程还在执行,线程A还在自旋等待,
这时又有一个线程B过来竞争这个锁对象,那么这个时候轻量级锁就会膨胀为重量级锁。
重量级锁把除了拥有锁的线程都阻塞,防止CPU空转。
如果该线程释放锁,则会唤醒所有阻塞线程,重新竞争锁。
上一篇
下一篇
java HTTP Server NanoHttpd
java nio echo server
GO文件读取
GO内建函数
GO make 和 new的区别
GO结构体三种初始化方式