synchronized有哪些锁?

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命令。主要针对有线程竞争的场景。

posted @ 2024-01-25 23:39  天NULL  阅读(32)  评论(0)    收藏  举报