5、静态内部类 (可用,推荐)
public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } }这是很多开发者推荐的一种写法,这种静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成对象的实例化。
同时,因为类的静态属性只会在第一次加载类的时候初始化,也就保证了SingletonInstance中的对象只会被实例化一次,并且这个过程也是线程安全的。
6、枚举 (可用、推荐)
public enum Singleton { INSTANCE; }这种写法在《Effective JAVA》中大为推崇,它可以解决两个问题:
1)线程安全问题。因为Java虚拟机在加载枚举类的时候会使用ClassLoader的方法,这个方法使用了同步代码块来保证线程安全。
2)避免反序列化破坏对象,因为枚举的反序列化并不通过反射实现。
好了,单例模式的几种写法就介绍到这了,最后简单总结一下单例模式的优缺点
单例模式的优缺点 优点单例类只有一个实例,节省了内存资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能;
单例模式可以在系统设置全局的访问点,优化和共享数据,例如前面说的Web应用的页面计数器就可以用单例模式实现计数值的保存。
缺点单例模式一般没有接口,扩展的话除了修改代码基本上没有其他途径。