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特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
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特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
相关文章推荐
- java基础_设计模式_单例模式二(详解6种写法)
- 黑马程序员__4java基础 静态和几种设计模式
- java基础,几种简单设计模式
- java设计模式之单例模式(几种写法及比较)
- 【设计模式】C++单例模式的几种写法——Java自动加载内部类对象,C++怎么破?
- java设计模式基础之设计原则
- java学习 第二章 设计模式基础
- java几种简单的设计模式
- [零基础学JAVA]Java SE应用部分-36.反射机制与工厂设计模式 推荐
- 黑马程序员---JAVA基础JAVA23种设计模式之---单例设计模式
- Java基础之装饰设计模式理解
- 黑马程序员:Java基础总结----模版方法设计模式
- java基础之设计模式之单例模式
- java几种简单的设计模式
- java基础知识记录--软件工程与设计模式(摘自张孝祥整理java面试题)
- 黑马程序员-JAVA基础-IO流中的装饰设计模式
- (2011年java基础)设计模式总结(简述)
- java 几种设计模式
- 几种常见设计模式的JAVA实现例子
- Java 基础一些代码练习笔记(设计模式-单列模式)