题目:设计一个类,我们只能生成该类的一个实例。
public class SingleObject {
//创建 SingleObject 的一个对象
private static SingleObject instance = new SingleObject();
//设置类的构造函数为 private,保证该类不会被实例化
private SingleObject(){}
//获取唯一可用的对象
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
public class SinglePatternDemo {
public static void main(String[] args){
//获取唯一可用的对象
SingleObject object = SingleObject.getInstance();
//显示消息
object.showMessage();
}
}
1、懒汉式,线程不安全
这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。
//懒汉式,线程不安全,最基本的实现方式
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
2、懒汉式,线程安全
可以在多线程的环境下工作,但是效率不高,因为加锁是一个非常耗时的操作。
//懒汉式,线程安全
public class Singleton1 {
private static Singleton1 instance;
private Singleton1(){}
public static synchronized Singleton1 getInstance(){
if(instance == null){
instance = new Singleton1();
}
return instance;
}
}
3、饿汉式,线程安全,建议使用
//饿汉式,线程安全,建议使用
public class Singleton2 {
private static Singleton2 instance = new Singleton2();
private Singleton2(){}
public static Singleton2 getInstance(){
return instance;
}
}
4、双检锁/双重校验锁(DCL,即 double-checked locking),可行的方法
//双检锁/双重校验锁(DCL,即 double-checked locking)
public class Singleton3 {
private volatile static Singleton3 singleton;
private Singleton3(){}
public static Singleton3 getSingleton(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton3();
}
}
}
return singleton;
}
}
5、登记式,静态内部类,推荐使用
//登记式,静态内部类
public class Singleton4 {
private static class SingletonHolder{
private static final Singleton4 INSTANCE = new Singleton4();
}
private Singleton4(){}
public static final Singleton4 getInstance(){
return SingletonHolder.INSTANCE;
}
}
6、枚举,线程安全
//枚举,线程安全
public enum Singleton5 {
INSTANCE;
public void whateverMethod(){
}
}