单件模式
2017-05-17 本文已影响3人
dd85bd3cabef
很多对象其实只要一个,比如线程池,缓存,对话框,注册表等。
经典的单件模式##
代码:
public class Singleton {
private static Singleton uniqueInstance;
public static Singleton getInstance(){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
这里实现了延迟实例化。
多线程保护##
多线程编程的时候,可能会出现初始化多个不同的instance实例的情况。
这时候,只需要让getInstance设置成同步的就可以了
public static synchronized Singleton getInstance(){
}
但是这样会拖累系统
- 如果应用对于这个拖累无所谓,那么就这么写吧。
- 如果频繁使用实例,并且很急切,那么就在静态初始化器中创建单件
private static Singleton uniqueInstance = newSingleton(); - 使用双重检查锁
private volatile static Singleton uniqueInstance();
...
public static Singleton getInstance(){
if(uniqueInstance==null){
synchronized{
(singleton.class);
}
}
这两种做法都是线程安全的。