静态内部类
当使用静态内部类的时候,又可以保证线程的安全,又可以得到不错的性能,是推荐使用的。
代码如下
package singleton.type6;
public class SingletonTest6 {
public static void main(String[] args) {
System.out.println("静态内部类,推荐使用");
Singleton singleton = Singleton.getInstance();
Singleton singleton1 = Singleton.getInstance();
System.out.println(singleton == singleton1);
System.out.println(singleton.hashCode());
System.out.println(singleton1.hashCode());
}
}
//静态内部类完成单例模式
class Singleton{
//1.私有化构造器
private Singleton(){}
//2.定义静态内部类
private static class SinglentonHolder{
private static final Singleton INSTANCE = new Singleton();
}
//3.定义静态公共方法
public static Singleton getInstance(){
return SinglentonHolder.INSTANCE;
}
}
当我们调用静态公共方法的时候,静态内存类才会被加载,这时候是线程安全的,同时也符合懒加载的条件,避免了内存的浪费。
枚举类
我们也可以使用枚举类来完成单例模式的创建,这种方法不仅是线程安全的,还可以防止通过反序列化来创建对象的形式,是推荐使用的。
代码如下
package singleton.type7;
public class SingletonTest7 {
public static void main(String[] args) {
System.out.println("通过枚举完成单例模式,推荐使用");
Singleton singleton = Singleton.INSTANCE;
Singleton singleton1 = Singleton.INSTANCE;;
System.out.println(singleton == singleton1);
System.out.println(singleton.hashCode());
System.out.println(singleton1.hashCode());
singleton.doSomething();
}
}
//通过枚举完成单例模式
enum Singleton{
INSTANCE;
public void doSomething(){
System.out.println("hello world");
}
}
总结
推荐使用创建单例模式有:双重检查锁,静态内部类,枚举类。如果确保对象一定会被使用,那么使用饿汉式的创建方式也可以。