所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

为什么单例模式要起名叫饿汉式和懒汉式?

发布时间:2020-04-12 08:48:11

资讯分类:懒汉式  饿汉式  单例模式  起名叫  实例  线程  加载
为什么单例模式要起名叫饿汉式和懒汉式?

你好,我是小黄,一个爱看书的java程序员,我来回答这个题,谢谢。


单例模式 (Singleton)就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供。

In eager initialization, the object is created in the program execution, in a normal way, which sometimes the programmer may not use it in the program. This looks waste of memory and processor time.

Other way is to create the object when the programmer really requires. This is called lazy initialization (one of the design patterns). That is, if the object is created at runtime, only when the programmer requires is known as lazy initialization.


饿汉式: 类加载的时候就实例化对象了,这样做节约了时间,并且线程安全,但是浪费内存空间。如果该实例从始至终都没被使用过,则会造成内存浪费。

懒汉式 :需要使用实例的时候才去加载,这么做节约了内存空间,浪费了时间,线程不安全的。这种也叫做延迟加载。

我们来看看饿汉式的代码:

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton() {}

public static Singleton getInstance() {

return instance;

}

}



再看看懒汉式 延迟加载的:

public class LazySingleton {

private static LazySingleton instance;

private LazySingleton() {}

public static LazySingleton getInstance() {

if (instance == null) {

instance = new LazySingleton();

}

return instance;

}

}


这种在多线程下是不安全的,因此有一种double-checked locking的解决方案,

进行了两次null检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断是否为 null,直接return实例化对象。同时,对singleton对象使用volatile关键字进行限制,保证其对所有线程的可见性,并且禁止对其进行指令重排序优化。代码如下:

public class DoubleCheckSingleton {

private static volatile DoubleCheckSingleton instance;

private DoubleCheckSingleton() {}

public static DoubleCheckSingleton getInstance() {

if (instance == null) {

synchronized (DoubleCheckSingleton.class) {

if (instance == null) {

instance = new DoubleCheckSingleton();

}

}

}

return instance;

}

}

其次也可以使用枚举的方式。


以上供参考,如果您觉得有点帮助,请帮忙点赞,转发,或者关注我,谢谢。

留言与评论(共有 0 条评论)
   
验证码:
Top