单例模式就是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种方法。
代码实现:(非线程安全)
public class Singleton {
/**
* 单例对象
*/
private static Singleton instance;
/**
* 私有构造器
*/
private Singleton() {}
/**
* 静态工厂方法
*/
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
代码实现:(线程安全)
public class Singleton {
/**
* 单例对象
* volatile关键字不但可以防止指令重排,也可以保证线程访问的变量值是主内存中的最新值
*/
private static volatile Singleton instance;
/**
* 私有构造器
*/
private Singleton() {}
/**
* 静态构造方法
*/
public static Singleton getInstance() {
//双重检测机制
if (instance == null) {
//同步锁
synchronized (Singleton.class) {
//双重检测机制
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
其它实现方式:(静态内部类,线程安全)
public class Singleton {
/**
* 私有构造器
*/
private Singleton() {}
/**
* 静态内部类
*/
private static class LoadLazy {
private static final Singleton INSTANCE = new Singleton();
}
/**
* 静态工厂方法
*/
public static Singleton getInstance() {
return LoadLazy.INSTANCE;
}
}
(两种写法:如果单例初始值是null,还未构建,则构建单例对象并返回。这个写法属于单例模式当中的懒汉模式,如果单例对象一开始就被new Singleton()主动构建,则不再需要判空操作,这种写法属于饿汉模式。)