单例怎么写( 五 )


从「先行发生原则」的角度理解的话 , 就是对于一个 volatile 变量的写操作都先行发生于后面对这个变量的读操作(这里的“后面”是时间上的先后顺序) 。但是特别注意在 Java 5 以前的版本使用了 volatile 的双检锁还是有问题的 。
其原因是 Java 5 以前的 JMM (Java 内存模型)是存在缺陷的 , 即时将变量声明成 volatile 也不能完全避免重排序 , 主要是 volatile 变量前后的代码仍然存在重排序问题 。这个 volatile 屏蔽重排序的问题在 Java 5 中才得以修复 , 所以在这之后才可以放心使用 volatile 。
相信你不会喜欢这种复杂又隐含问题的方式 , 当然我们有更好的实现线程安全的单例模式的办法 。饿汉式 static final field这种方法非常简单 , 因为单例的实例被声明成 static 和 final 变量了 , 在第一次加载类到内存中时就会初始化 , 所以创建实例本身是线程安全的 。
12345678910public class Singleton {//类加载时就初始化private static final Singleton instance = new Singleton();private Singleton (){}public static Singleton getInstance (){return instance;}}这种写法如果完美的话 , 就没必要在啰嗦那么多双检锁的问题了 。缺点是它不是一种懒加载模式(lazy initialization) , 单例会在加载类后一开始就被初始化 , 即使客户端没有调用 getInstance()方法 。
饿汉式的创建方式在一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的 , 在 getInstance() 之前必须调用某个方法设置参数给它 , 那样这种单例写法就无法使用了 。静态内部类 static nested class我比较倾向于使用静态内部类的方法 , 这种方法也是《Effective Java》上所推荐的 。
123456789public class Singleton {private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}private Singleton (){}public。
8. 如何写一个单例模式 class Single(object): _instance = None _is_init = False def __new__(cls, *args, **kw): if cls._instance is None: cls._instance = object.__new__(cls, *args, **kw) return cls._instance def __init__(self): if not Single._is_init: # 给对象进行来初始源化 , 添加相关2113属性 #。
# 表示对象已经初始化完成了 。Single._is_init = True你学会了吗?学习更多编5261程的知识 , 不知道去哪里找资料4102 , 黑马程序员就有很多1653哦 。
9. 单例模式怎样写 class StringManager {
private static StringManager instance;
private Map beanMap;
private StringManager() {
beanMap = new HashMap();
}
public static StringManager getInstance() {
if (instance == null) {
instance = new StringManager();
}
return instance;
}
public Object getBean(String beanName) {
return beanMap.get(beanName);
}
【单例怎么写】}