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

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

  •  
  •   git00ll · 2020-09-15 19:37:17 +08:00 · 1747 次点击
    这是一个创建于 1533 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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  
    OP
       2020-09-15 20:17:02 +08:00   ❤️ 1
    自问自答一下,是因为 jvm 在加载过程中会暂时禁用偏向锁,所以此处只有轻量级锁。
    可以在调用 test 方法之前,先休眠 5 秒,这样等 jvm 完全加载完成后,偏向锁才能生效,就能看到效果了。
    sagaxu
        2
    sagaxu  
       2020-09-15 21:35:41 +08:00 via Android
    JDK15 开始已经默认禁用偏向锁,未来版本会移除这个功能
    HiShan
        3
    HiShan  
       2020-09-16 09:46:24 +08:00
    别学了,都被弃用了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4693 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 04:01 · PVG 12:01 · LAX 20:01 · JFK 23:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.