每天学一点设计模式-单例模式
2014-11-13 14:53
323 查看
单例模式
英文名
Singleton Pattern定义
确保一个类只有一个实例,并提供一个全局访问点。代码
public class Singleton {private static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
上面的代码会有一些安全的问题,当2个对象同时访问到if(uniqueInstance==null)时,可能就会创建2个对象。为了防止这样的情况出现,最好加上同步锁
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
加上同步锁之后,虽然可以解决上面的问题。但是效率却降低了,因为同步本来就是牺牲效率的机制,每次只在第一次创建实例时才有必要加同步锁,其他时候同步锁都是没用的,却还要浪费时间。可以通过下面两种方式解决
1.急切创建实例
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
2.双重检查加锁
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
其中的新颖点是volatile变量。
相关文章推荐
- 每天学一点设计模式-命令模式
- 每天学一点设计模式-策略模式
- 每天学一点设计模式-模板方法模式
- 每天学一点设计模式-适配器模式
- 每天学一点设计模式-观察者模式
- 每天学一点设计模式-外观模式
- 每天学一点设计模式-工厂方法模式
- 每天学一点设计模式-状态模式
- 每天学一点设计模式-抽象工厂模式
- 每天学一点设计模式-装饰者模式
- JAVA 23设计模式一点就通
- 关于设计模式的一点感想
- 23种java设计模式一点就通
- 每天学一点flash(51) 工厂模式
- 每天学习一点flash(33) as 3.0 游戏设计笔记(2)
- 23种java设计模式一点就通
- 设计模式的一点看法
- 谈谈mvp for asp.net模式设计的一点感想
- 每天学习一点flash(35) 游戏设计笔记 (5) 跳跃算法笔记
- 每天学一点flash(34) as 3.0 游戏设计笔记(3)