单例模式代码怎么写?

一、单例模式

什么是单例?确保在整个应用程序中只能有一个实例对象存在。

单例模式创建方式:饿汉和懒汉。

饿汉就是太饿了,所以提前把饭(单例)做好。需要的时候直接吃了。

懒汉就是懒得做饭(生成单例),饿的时候再吃。

饿汉代码实现:

1.构造方法私有化。

2.定义一个私有静态变量,直接在类加载的时候,直接生成一个唯一变量。修饰词:private static final (不需要volatile)

3.提供1个公开获得该变量的方法,返回该变量就行。

public class Singleton{

    //构造方法私有化
    private Singleton(){
    }
    
    //类加载时候,直接生成唯一实例变量
    private static final Singleton singleton = new Singleton();

    //对外提供拿到它的唯一实例的方法
    public static Singleton getSingleton(){
        return singleton;
    }

}

懒汉代码实现:

1.首先,将构造方法私有化,不对外提供构造方法。不然别人如果可以new对象,new出来的就不是同一个了。

2.先定义一个私有静态变量,初始化值null,并用volatile关键词修饰,确保可见性。保证直接从内存中读取最新值。修饰词:private volatile static 

3.定义1个public static 供他人拿到该单例的方法,并采用双检索方式,解决线程安全问题,确保多线程环境下只会创建1个实例。

该方法:先查,静态变量是否是空的。如果不是空的,直接返回。如果是空的,加一层synchroized锁,然后再判断是否是空的,如果是,就实例化new 1 个对象。这个方法只会走一次。

public class Singleton{

    //构造函数私有化
    private Singleton(){
    };
    
    //volatile 多线程可见,禁止指令重排,保证现场原子性
    private volatile static Singleton singleton = null ;

    // DCL 双重检索
    public static Singleton getSingleton (){
        if(singleton ==null){
            synchronized(Singleton.class){
                if(singleton ==null){
                    singleton = new Singleton();
                }    
            }
        }
        return singleton ;
    }
} 

猜你喜欢

转载自blog.csdn.net/tomorrow9813/article/details/131463621