您的位置:首页 > 编程语言 > Java开发

java设计模式基础-单例模式的几种写法

2015-04-11 13:24 363 查看
第一种(线程不安全,多线程不能正常工作):

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

第二种(线程安全,效率很低,99%情况下不需要同步):

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

第三种(静态内部类、延迟初始化方法
推荐使用):

public class Singleton {

private static class SingletonHolder {

private static final Singleton INSTANCE = new Singleton();

}

private Singleton (){}

public static final Singleton getInstance() {

return SingletonHolder.INSTANCE;

}

}

注释:这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程

第四种(双重校验锁):

public class Singleton {

2 private volatile static Singleton singleton;

3 private Singleton (){}

4 public static Singleton getSingleton() {

5 if (singleton == null) {

6 synchronized (Singleton.class) {

7 if (singleton == null) {

8 singleton = new Singleton();

9 }

10 }

11 }

12 return singleton;

13 }

14 }

第五种(枚举):

public enum Singleton {

2 INSTANCE;

3 public void whateverMethod() {

4 }

5 }

注释:这种方式是Effective
Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: