java锁状态基本概念
1、简介 Java有四种锁状态:无锁、偏向锁、轻量锁、重量锁,锁可以逐渐升级,但是不可以降级。 2、锁状态 在Java中对象的锁存储在对象头Mark Word中(该字段存储对象的hashcode或者锁信息) 2.1、偏向锁 2.1.1、获取 当一个线程访问同步代码块并获取锁的时候,会在对象头和栈帧中的锁记录里存储偏向锁的线程ID,以后该线程在进入和退出同步块时,不需要进行CAS加锁和解锁,会查询对象头中Mark Word是否存储着指向该线程的偏向锁,如果成功,表示线程已经获得了锁。如果失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程; 2.1.2、撤销 当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放偏向锁。当另一个线程试图访问偏向锁时,会首先暂停拥有偏向锁的进程,如果线程没有运行,则将对象锁的对象头设置为无锁状态。如果线程正在运行,则会暂停该线程,恢复到无锁状态,或者标记对象不适合作为偏向锁,最后唤醒该线程。 2.1.3、优缺点 偏向锁适用于大多数时候....