在之前的博文中曾經介紹過單例模式:
https://blog.csdn.net/timchen525/article/details/78244101
這裏重新討論們下單例模式,並且引入了一個基於枚舉的單例模式。
**
* 懶漢模式
*/
public class SingletonExample {
// 私有構造函數
private SingletonExample() {
}
// 單例對象
private static SingletonExample instance = null;
// 靜態的工廠方法
public static SingletonExample getInstance() {
if (null == instance) {
instance = new SingletonExample();
}
return instance;
}
}
public class SingletonExample {
// 私有構造函數
private SingletonExample() {
}
// 單例對象
private static SingletonExample instance = null;
// 靜態的工廠方法
public static synchronized SingletonExample getInstance() {
if (null == instance) {
instance = new SingletonExample();
}
return instance;
}
}
public class SingletonExample {
// 私有構造函數
private SingletonExample() {
}
// 單例對象
private static SingletonExample instance = null;
// 靜態的工廠方法
public static SingletonExample getInstance() {
if (null == instance) { // B
synchronized (SingletonExample.class) {
if (null == instance) { // 雙重檢測機制
instance = new SingletonExample(); // A-3
}
}
}
return instance;
}
}
public class SingletonExample {
// 私有構造函數
private SingletonExample() {
}
// 單例對象
private volatile static SingletonExample instance = null;
// 靜態的工廠方法
public static SingletonExample getInstance() {
if (null == instance) {
synchronized (SingletonExample.class) {
if (null == instance) {
instance = new SingletonExample();
}
}
}
return instance;
}
}
public class SingletonExample {
// 私有構造函數
private SingletonExample() {
}
// 單例對象
private static SingletonExample instance = new SingletonExample();
// 靜態的工廠方法
public static SingletonExample getInstance() {
return instance;
}
}
public class SingletonExample {
// 私有構造函數
private SingletonExample() {
}
public static SingletonExample getInstance() {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SingletonExample singletonExample;
// JVM保證這個方法絕對只調用一次
Singleton() {
singletonExample = new SingletonExample();
}
public SingletonExample getInstance() {
return singletonExample;
}
}
}