线程安全,双重校验

public class Main {

    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);
    }

}

class Singleton {

    private volatile static Singleton instance;

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

}

线程的不安全(懒汉式)

class Singleton {

 private static Singleton instance;

 private Singleton() {
    
 }
 
 public static Singleton getInstance(){
        if(instance == null){
           instance = new Singleton();
        }
        return instance;
    }
}

线程不安全(饿汉式)

class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
    
    }
    
    public static Singleton getInstance(){
        return instance;
    }
   
}

备注:饿汉式和 懒汉式也可以是线程安全的,比如加上synchronized