笔试小结系列:写一个单例!延迟加载,线程安全,高性能

写一个单例!延迟加载,线程安全,高性能

上面提到延迟加载,所谓延迟加载,就是指当实际用到该对象时才加载对应类,否则只是声明,并未实际花费资源去初始化对象

首先先来一个最基本的,最最简单的

public class Singleton {
    
      
    private Singleton() {
    
    }  //私有的构造函数
    private static Singleton instance = null;  
    public static Singleton getInstance() {
    
      
        if(instance == null) {
    
      
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

它的问题是什么?

在单线程下,它是没问题的,但是在多线程下,如果多个线程同时调用getInstance,则可能会调用多次new,会产生问题。

怎么解决?

想到使用锁、synchronized等方法

正确的双重检查锁

先判断对象是否已经被初始化,再决定要不要加锁。

public class Singleton {
    
    
    private volatile static Singleton uniqueSingleton;

    private Singleton() {
    
    
    }

    public Singleton getInstance() {
    
    
        if (null == uniqueSingleton) {
    
    
            synchronized (Singleton.class) {
    
    
                if (null == uniqueSingleton) {
    
    
                    uniqueSingleton = new Singleton();
                }
            }
        }
        return uniqueSingleton;
    }
}

静态内部类法

我们可以把Singleton实例放到一个静态内部类中,这样就避免了静态实例在Singleton类加载的时候就创建对象,并且由于静态内部类只会被加载一次,所以这种写法也是线程安全的

public class Singleton {
    
    
    private static class Holder {
    
    
        private static Singleton singleton = new Singleton();
    }
    
    private Singleton(){
    
    }
        
    public static Singleton getSingleton(){
    
    
        return Holder.singleton;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43337081/article/details/109086603