Java中的synchronized,想必从事Java的同学都是知道的。可是synchronized有哪些锁呢?可能有些同学就不知道了。
Java6以后,synchronized共有三把锁,偏向锁、轻量级锁、重量级锁。
所谓锁升级,就是偏向锁 -> 轻量级锁 -> 重量级锁 升级的过程。
要说清楚这三把锁,就要从Java对象的对象头布局开始介绍。
Java对象的对象头,是和对象所描述的数据无关的。对象头中有一个Mark Word,包含哈希码、GC年龄、锁标志信息。其中,锁标志便是synchronized实现三种锁的关键。
偏向锁:
利用CAS在Mark Word中写入线程ID,锁标志位为 01;
优点:针对只会有同一个线程来获取锁的场景,性能很高。因为只需要比较Mark Word中的线程ID和当前的线程ID。
缺点:偏向锁的撤销是个很重的操作。因为对象头被直接覆盖了,撤销时,就需要重新计算对象的哈希码、GC年龄。
轻量级锁:
利用CAS,先将Mark Work 复制到线程内存中,然后在Mark Word中写入线程指针,锁标志位00;
优点:针对无线程竞争的场景,性能很高。和偏向锁相比较,多了Mark Work的来回复制,属于轻量级操作。
重量级锁:
利用操作系统的mutex命令。主要针对有线程竞争的场景。
标签:Java,synchronized,哪些,Mark,线程,Word,轻量级 From: https://www.cnblogs.com/kingcode/p/17988432