推荐的单例模式写法

双重检查单例

package singletonPattern;
//双重检查应用实例方式
class Singleton6{
    private Singleton6(){}

    private static volatile Singleton6 singleton;

    public static Singleton6 getInstance(){
        if(singleton==null){
            synchronized(Singleton6.class){
                if(singleton == null){
                    singleton= new Singleton6();
                }
            }
        }
        return singleton;
    }
}
/*
双重检查应用实例方式:

线程安全、延迟加载、效率较高

结语:开发中推荐使用!
*/

这个时候博主就得哔哔几句了,细心的童鞋会发现有一个Volatile关键字,完了,没见过,小白童鞋慌了!

Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。

这种实现方式既可以实现线程安全地创建实例,而又不会对性能造成太大的影响。它只是第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度。

静态内部类单例

package singletonPattern;
//static静态内部类单例

class Singleton7{
    private Singleton7(){}

    private static volatile Singleton7 instance;

    //写一个static静态内部类,给该类添加一个static静态instance属性
    private static class SingletonInstance{
        private static final Singleton7 SINGLETON_7=new Singleton7();
    }

    //
    public static synchronized Singleton7 getInstence(){
        return SingletonInstance.SINGLETON_7;
    }
}
/*
静态内部类单例方式
        1、这种方式采用了类加载机制来保证初始化实例时只有一个线程
        2、巧妙的将实例化Singleton操作放进getInstance方法中,getInstance方法返回静态内部类中实例化好的Singleton
        3、类的静态属性只会在第一次加载类的时候初始化,也就是只会初始化一次,在这里,JVM帮我们保证了线程的安全,类在初始化时,别的线程无法进入。
       
        优点:线程安全、利用静态内部类特点实现延迟加载、效率高
        开发中推荐使用这种静态内部类单例方式!

static静态内部特点:
1、外部类加载不会导致内部类加载,保证了其懒加载
*/

这个单例,宜春就不得不哔哔两句了,要清楚这个单例,必须要明白static静态内部特点,也就是外部类加载不会导致内部类加载!

枚举

package singletonPattern;
//使用枚举

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader;

enum Singleton8{
    INSTANCE;
    public void methodName(){
        System.out.println("测试数据");
    }
}
/*

枚举方式的枚举:
推荐写法,简单高效。充分利用枚举类的特性,只定义了一个实例,且枚举类是天然支持多线程的。
借助JDK1.5中添加的枚举来实现单例模式优点:
		 1、不仅能避免多线程同步问题 
		 2、还能防止反序列化重新创建新的对象

枚举方式单例是由Effective java作者Josh Bloch提倡的,结语:推荐使用!
*/

总结

  • 双重检查单例: 双重检查应用实例方式,线程安全、延迟加载、效率较高。因此开发中推荐使用!
  • 静态内部类单例:静态内部类单例方式线程安全、利用静态内部类特点实现延迟加载、效率高。 开发中推荐使用这种静态内部类单例方式!
  • 枚举:借助JDK1.5中添加的枚举来实现单例模式不仅能避免多线程同步问题还能防止反序列化重新创建新的对象。枚举方式单例是由Effective java作者Josh Bloch提倡的,开发中推荐使用!

原文链接:https://blog.csdn.net/qq_44543508/article/details/103249751

你可能感兴趣的:(Java,设计模式,java,设计模式)