V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
tuzhenyu
V2EX  ›  程序员

Java 关键字 synchronized 能不能禁止指令重排序?

  •  
  •   tuzhenyu · 2017-10-14 19:49:48 +08:00 · 6040 次点击
    这是一个创建于 2630 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在一些书上和博客上看到说 synchronized 有禁止指令重排序的作用,如果这样的话单例模式的双重检查锁模式就不需要 volatile 修饰了吧?求助大佬...

    12 条回复    2017-10-16 13:05:38 +08:00
    sagaxu
        1
    sagaxu  
       2017-10-14 20:19:33 +08:00 via Android
    理解有误
    juxingzhutou
        2
    juxingzhutou  
       2017-10-14 20:23:00 +08:00
    synchronized 都已经加锁了你还要双重锁检查干嘛?
    tuzhenyu
        3
    tuzhenyu  
    OP
       2017-10-14 20:24:21 +08:00
    @sagaxu 是 synchronized 没有禁止指令重排序的作用吗?
    tuzhenyu
        4
    tuzhenyu  
    OP
       2017-10-14 20:27:22 +08:00
    @juxingzhutou   单例模式的双重检查是双重非空检查,只加了一个 synchronized 锁

    public class DoubleCheckedLocking {
    private static Instance instance;

    public static Instance getInstance() {
    if (instance == null) {
    synchronized (DoubleCheckedLocking.class) {
    if (instance == null)
    instance = new Instance();
    }
    }
    return instance;
    }
    }
    iEverX
        5
    iEverX  
       2017-10-14 20:31:50 +08:00
    没有,需要加 volatile 的
    juxingzhutou
        6
    juxingzhutou  
       2017-10-14 20:36:26 +08:00
    @tuzhenyu 你这样写的话 synchronized 并不能保证在它之前的非空判断的“顺序”问题,根据 JSR-133 定义的 JMM,synchronized 的加锁和解锁之间能够有确定的顺序,但是多个线程下 synchronized 之前的非空判断之间并不能保证顺序。所以需要用 volatile 来保证非空判断之间的 happens-before 关系。

    有兴趣的话建议你完整地看一下 JSR-133 相关的文章。
    tuzhenyu
        7
    tuzhenyu  
    OP
       2017-10-14 20:42:51 +08:00
    @juxingzhutou 好的 谢谢!
    tuzhenyu
        8
    tuzhenyu  
    OP
       2017-10-14 20:43:12 +08:00
    @iEverX 谢谢!
    NUT
        9
    NUT  
       2017-10-15 15:36:02 +08:00
    @juxingzhutou 正解。
    @tuzhenyu JMM 会保证程序在允许范围内执行指令混排,所以在视觉上会给人造成顺序执行的假象。除了用 syn 意外还能使用 乐观锁的 思想来处理。看着这个 访问 http://www.hollischuang.com/archives/1866
    XiLemon
        10
    XiLemon  
       2017-10-15 16:35:20 +08:00 via iPhone
    楼主搜一搜陈皓和 wuchong 的单例模式正确写法的 blog
    hantsy
        11
    hantsy  
       2017-10-16 10:00:09 +08:00
    来看看 Bob Lee ( Guice 作者) 的双检模型:
    http://blog.crazybob.org/2007/01/lazy-loading-singletons.html
    ppaapc
        12
    ppaapc  
       2017-10-16 13:05:38 +08:00
    加了 synchronized 关键字还需要禁止指令重排序干嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:40 · PVG 17:40 · LAX 01:40 · JFK 04:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.