剑指offer面试题2:实现 Singleton 模式(Java 实现)

题目:设计一个类,我们只能生成该类的一个实例。

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、枚举,线程安全

扫描二维码关注公众号,回复: 5327074 查看本文章
//枚举,线程安全
public enum Singleton5 {
	INSTANCE;
	public void whateverMethod(){
		
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41163113/article/details/86841235