3

在某些站点/博客中,我发现单例代码为

public class MySingleton{

    private static MySingleton instance = null;
    .......
    .......
}

在其他一些地方,我发现单例代码为

public class MySingleton{

    private volatile static MySingleton instance = null;
    .......
    .......
}

是否有必要MySingleton作为参考volatile?会有什么意义吗?

4

5 回答 5

1

Java 中的 Volatile 关键字用作 Java 编译器和线程的指示符,它们不缓存此变量的值并始终从主内存中读取它

** 编辑 **

private volatile static MySingleton instance = null;

在上面的代码片段中,volatile 关键字确保多个线程在将instance变量初始化为 MySingleton 实例时正确处理该变量。

阅读更多:http: //javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz2BYyA5Jnm

于 2012-11-07T18:32:52.130 回答
0

要么你想用一个简单的enum

public enum MySingleton {
    INSTANCE
}

或者你有充分的理由让它变得更复杂

public class MySingleton {
    private MySingleton() { }

    private static MySingleton instance = null;

    public synchronized static MySingleton getInstance() {
         if (instance == null)
             instance = new MySingleton();
         return instance;
    }
}

无论哪种方式,使用 volatile 都无济于事。

恕我直言,没有一个好的单例模式可供您使用volatile,因此如果需要,代码需要修复或简化。


AFAIK 使用 volatile 的唯一情况是双重检查锁定

public class MySingleton {
    private MySingleton() { }

    private static volatile MySingleton instance = null;

    public static MySingleton getInstance() {
         if (instance == null)
             synchronzied(MySingleton.class) {
                 if (instance == null)
                     instance = new MySingleton();
             }
         return instance;
    }
}

为了比较,enum上面的示例做了很多示例。

http://javarevisited.blogspot.co.uk/2011/06/volatile-keyword-java-example-tutorial.html

http://www.ibm.com/developerworks/java/library/j-dcl/index.html

于 2012-11-07T18:29:15.117 回答
0

仅当您在多线程系统中具有可变单例字段时才需要这样做,特别是在单例延迟初始化的情况下。

这是关于如何在 Java 中的多线程系统中延迟初始化单例的更大讨论的一部分。有几种机制可用于此,但最流行的是:

目前公认的为多线程系统保存延迟初始化的单例的方法是这种enum方法,尽管它们都在 Java 1.5+ 中工作。

于 2012-11-07T18:31:16.220 回答
0

好吧,是的,如果它是可变的并且出现在多线程代码中。您只需要了解什么volatile意思,单身人士是否需要使用它并没有什么特别之处。

于 2012-11-07T18:25:24.700 回答
0

无法判断 - 在两个示例中字段都是私有的,因此根据它们的发布方式,您可能需要也可能不需要它们是易变的。标准的习惯用法是改用枚举

于 2012-11-07T18:28:12.700 回答