23种设计模式——单例模式
单例模式:一个对象在整个程序只有一次创建。
其有两种创建时机
1.在程序一开始执行时就创建,称为饿汉式。
2.在需要使用到这个对象时在创建,称为懒汉式。
饿汉式
静态常量
class Singleton{
//私有构造器,外部不能new
private Singleton(){}
//实例化对象
private final static Singleton instance = new Singleton();
//提供外部获取实例的方法
public static Singleton getInstance() {
return instance;
}
}
静态代码块
class Singleton {
//私有构造器,外部不能new
private Singleton() {
}
private final static Singleton instance;
static { //使用静态代码块来实例化对象
instance = new Singleton();
}
//提供外部获取实例的方法
public static Singleton getInstance() {
return instance;
}
}
懒汉式
方法一:(不推荐)线程不安全
class Singleton3{
//私有构造器,外部不能new
private Singleton3() {
}
private static Singleton3 instance;
public static Singleton3 getInstance() {
if (instance==null){
//此使如果线程在这堵塞,其它线程进行了实例,这个线程
//会再new一次
instance = new Singleton3();
}
return instance;
}
}
方法二:(不推荐)线程安全但效率低
class Singleton4{
//私有构造器,外部不能new
private Singleton4() {
}
private static Singleton4 instance;
//加入了synchronized,对同步处理
public static synchronized Singleton4 getInstance() {
if (instance==null){
instance = new Singleton4();
}
return instance;
}
}
双重检测
(推荐)保证线程安全和效率**
重点:变量使用volatile前缀
volatile详讲
class Singleton5 {
private Singleton5() {
}
//使用volatile前缀,保证instance变量的可见性
private static volatile Singleton5 instance;
public static Singleton5 getInstance() {
if (instance == null) {
synchronized (Singleton5.class) {
if (instance == null) {
instance = new Singleton5();
}
}
}
return instance;
}
}
静态内部类
(推荐)
class Singleton6 {
private Singleton6() {
}
//在类转载的时候,线程是安全的
private static class SingletonInstance {
private static final Singleton6 INSTANCE = new Singleton6();
}
public static synchronized Singleton6 getInstance() {
return SingletonInstance.INSTANCE;
}
}
使用枚举
(推荐)
单元素的枚举类型已经成为实现Singleton的最佳方法
– 出自 《effective java》
enum Singleton7{
instance;
public void method(){
//方法
}
}