单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
public class HungryManSingle {
   private static HungryManSingle hungryManSingle=new HungryManSingle();
   //构造方法私有
   private HungryManSingle(){}
   public static HungryManSingle getHungryManSingle(){
       return hungryManSingle;
   }
}
在线程访问单例对象之前就已经创建好了。再加上,由于一个类在整个生命周期中只会被加载一次,因此该单例类只会创建一个实例。也就是说,线程每次都只能也必定只可以拿到这个唯一的对象。即饿汉式单例天生就是线程安全的。
public class LazySingleObjectNoSyn {
    private static LazySingleObjectNoSyn lazySingleObjectNoSyn;
    
    private LazySingleObjectNoSyn(){}
    
    public static LazySingleObjectNoSyn getLazySingleObjectNoSyn(){
        if(lazySingleObjectNoSyn ==null){
            lazySingleObjectNoSyn = new LazySingleObjectNoSyn();
        }
        return lazySingleObjectNoSyn;
    }
    
}
* 我们假设有多个线程1,线程2都需要使用这个单例对象。而恰巧,线程1在判断完s==null后突然交换了cpu的使用权,变为线程2执行,
* 由于s仍然为null,那么线程2中就会创建这个Singleton的单例对象。之后线程1拿回cpu的使用权,而正好线程1之前暂停的位置就是判断s是否为null之后,
* 创建对象之前。这样线程1又会创建一个新的Singleton对象。
public class LazySingleObjectSyn {
    private static LazySingleObjectSyn lazySingleObjectSyn;
    private LazySingleObjectSyn(){}
    public static synchronized LazySingleObjectSyn getLazySingleObjectSyn(){
        if (lazySingleObjectSyn==null){
            lazySingleObjectSyn=new LazySingleObjectSyn();
        }
        return lazySingleObjectSyn;
    }
}
public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}
public class StaticSingle {
    private StaticSingle() {}
    public static class Sin{
     private   final static  Sin sin=new Sin();
    }
   public static Sin getInstance(){
        return Sin.sin;
   }
}
public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}
原文:https://www.cnblogs.com/mangoubiubiu/p/14790944.html