【jvm jdk】锁状态位之轻量级锁


相关文章:
锁状态位之无锁
锁状态位之偏向锁
锁状态位之轻量级锁
锁状态位之重量级锁

1. 验证轻量级锁

在这里插入图片描述
我们创建一个对象,没有上锁(可偏向锁,锁标识为偏向锁,但偏向线程ID为空),然后线程A上锁(真正加偏向锁,给偏向线程ID赋值),A结束后,线程B接着上锁,此时产生竞争,但是由于A已经结束,是轻度的竞争,来观察锁标识位,我们期望是轻量级锁:

import org.openjdk.jol.info.ClassLayout;
import java.util.concurrent.TimeUnit;
public class Test {

    public static void main(String[] args) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //创建可偏向对象(偏向线程ID为空)
        Object o = new Object();
        System.out.println(ClassLayout.parseInstance(o).toPrintable());

        //开启一个线程A,对象o加偏向锁(偏向线程ID为A)
        new Thread(()->{
            synchronized (o){
                System.out.println(ClassLayout.parseInstance(o).toPrintable());
            }
        }).start();

        try {
           //确保线程A结束才会触发线程B加锁
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //验证对象o加偏向锁(偏向线程ID为A)
        System.out.println(ClassLayout.parseInstance(o).toPrintable());

        //启动线程B,此时A加锁后,会释放锁,线程B也接着在o上加锁
        new Thread(()->{
            synchronized (o){
                System.out.println(ClassLayout.parseInstance(o).toPrintable());
            }
        }).start();
    }
}

执行结果:


java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           05 88 fe 19 (00000101 10001000 11111110 00011001) (436111365)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           05 88 fe 19 (00000101 10001000 11111110 00011001) (436111365)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           30 f7 c4 1a (00110000 11110111 11000100 00011010) (449115952)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total


Process finished with exit code 0

分析:第一条打印显示没有上锁(可偏向锁,锁标识为偏向锁,但偏向线程ID为空)
第二条和第三条打印相同,显示线程A上锁(真正加偏向锁,给偏向线程ID赋值)
第四条打印现实的是经B上锁后,变成了轻量级锁。
在这里插入图片描述

总结

如果是弱竞争,就是轻量级锁。什么是弱竞争?就是不同的线程虽然都访问同一个对象,但是实际上没有产生竞争,因为他们是依次去访问的,一个结束后,另一个才去访问,并且同一时刻没有冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值