饿汉方式:因为加载类的时候就创建实例,所以线程安全(多个ClassLoader存在时例外)。缺点是不能延时加载。 懒汉方式:需要加锁才能实现多线程同步,但是效率会降低。优点是延时加载。 静态内部类:延迟加载,减少内存开销。因为用到的时候才加载,避免了静态field在单例类加载时即进入到堆内存的permanent代而永远得不到回收的缺点。
一、饿汉式单例
public class Singleton{ private Singleton() {} private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } }
二、懒汉式单例
public class Singleton{ private static Singleton instance = null; private Singleton(){} public synchronized static Singleton getInstance() { if(instance = null) { instance = new Singleton(); } return instance; } }
三、单例模式嵌套类实现
public class InnerClassSingleton { 4. 5. private InnerClassSingleton(){}; 6. 7. static class staticInnerSingle{ 8. private static InnerClassSingleton instance = new InnerClassSingleton(); 9. } 10. 11. public static InnerClassSingleton getInstance(){ 12. return staticInnerSingle.instance; 13. } 14.}