您的位置:首页 > 其它

单例模式几种实现

2017-11-08 09:55 176 查看
1.单线程模式下,推荐懒加载

public class Singleton1 {
private static Singleton1 singleton = null;
private Singleton1() {
}
public static Singleton1 getInstance() {
if (singleton == null) {
singleton = new Singleton1();
}
return singleton;
}
}


2.上述1演示,线程不安全,最容易想到的变为线程安全的方式就是加关键字synchronized

public class Singleton1_1 {
private static Singleton1_1 singleton = null;
private Singleton1_1() {
}
public synchronized static Singleton1_1 getInstance() {
if (singleton == null) {
singleton = new Singleton1_1();
}
return singleton;
}
}


3.“双重检查锁”(Double Check Lock,简称DCL)

public class Singleton1_2 {
private static Singleton1_2 singleton = null;
private Singleton1_2() {
}
public static Singleton1_2 getInstance() {
if (singleton == null) {
synchronized (Singleton1_2.class) {
if (singleton == null) {
singleton = new Singleton1_2();
}
}
}
return singleton;
}
}


4.由于指令重排,上述3,仍然可能不安全,volatile关键字可以解决此问题

public class Singleton1_3 {
private static volatile Singleton1_3 singleton = null;
private Singleton1_3() {
}
public static Singleton1_3 getInstance() {
if (singleton == null) {
synchronized (Singleton1_3.class) {
if (singleton == null) {
singleton = new Singleton1_3();
}
}
}
return singleton;
}
}


5.饿汉模式

public class Singleton2 {
private static final Singleton2 singleton = new Singleton2();
private Singleton2() {
}
public static Singleton2 getInstance() {
return singleton;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式