V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GeekHub
git00ll
V2EX  ›  Java

为什么同步代码块升级到轻量级锁,而不是偏向锁了呢

  •  
  •   git00ll · 4 天前 · 714 次点击

    按照如下代码进行测试,理论上同步代码块里应该对对象添加偏向锁,可是为什么从输出上来看,添加的是轻量锁呢

    java 版本 1.8.0_192-b12

    	public static void test(){
    		Object o = new Object();
    		System.out.println(ClassLayout.parseInstance(o).toPrintable());
    		synchronized (o){
    			System.out.println(ClassLayout.parseInstance(o).toPrintable());
    		}
    		System.out.println(ClassLayout.parseInstance(o).toPrintable());
    	}
    
    java.lang.Object object internals:
     OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
          0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
          4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
    
    
    java.lang.Object object internals:
     OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
          0     4        (object header)                           b0 f4 70 01 (10110000 11110100 01110000 00000001) (24179888)
          4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
    
    
    java.lang.Object object internals:
     OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
          0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
          4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
    
    
    
    3 条回复    2020-09-16 09:46:24 +08:00
    git00ll
        1
    git00ll   4 天前   ❤️ 1
    自问自答一下,是因为 jvm 在加载过程中会暂时禁用偏向锁,所以此处只有轻量级锁。
    可以在调用 test 方法之前,先休眠 5 秒,这样等 jvm 完全加载完成后,偏向锁才能生效,就能看到效果了。
    sagaxu
        2
    sagaxu   4 天前 via Android
    JDK15 开始已经默认禁用偏向锁,未来版本会移除这个功能
    HiShan
        3
    HiShan   3 天前
    别学了,都被弃用了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1136 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:26 · PVG 03:26 · LAX 12:26 · JFK 15:26
    ♥ Do have faith in what you're doing.