您的位置:首页 > 其它

每天学一点设计模式-单例模式

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变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: