确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
以下代码中,singleton = new Singleton(); 指的就是自行实例化。
public class Singleton { private static final Singleton singleton = new Singleton(); // 限制只能有一个实例 private Singleton(){ } // 通过get方法获取实例 public static Singleton getSingleton() { return singleton; } public void doSomeThing(){ } }2、单例模式的优缺点 2.1 优点
因存在中只有一个实例,减少了内存的开支。若一个对象需要频繁的创建与销毁,且性能无法优化时,可以考虑使用单例模式。
因存在中只有一个实例,减少了系统的性能消耗,若一个对象的产生需要较多的资源时,如产生其他的依赖对象。则可以产生一个单例对象,使其永久的存在内存中来解决。
避免资源重复占用,比如写文件
设置全局访问点,比如工具类
2.2 缺点单例模式因需要自行实例化,因此一般没有接口或抽象类,扩展困难。单例模式与单一职责原则冲突。 3 使用场景
共享数据的访问点,比如页面计数器,不需要每次都记录到数据库中创建一个对象需要过多的资源,并且经常用到时需要定义大量的静态常量和静态方法,比如工具类 4 注意事项
高并发模式下防止产生多个示例的线程安全问题。
public class Singleton { private static final Singleton singleton = null; // 限制只能有一个实例 private Singleton(){ } // 通过get方法获取实例 public static Singleton getSingleton() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
以上代码在高并发的情况下就有可能生成两个或多个实例。解决的方法有很多,比如用第一张图的饿汉式单例或双重检测机制来解决。
需要注意对象的复制情况,最好的方法就是不实现Cloneable接口
另外还需要注意垃圾回收机制,如果一个单例对象在内存中长期未使用,JVM会认为这个对象是个垃圾,空闲时将其收掉。下次调用时会创建一个新的出来,会失去原有的状态,导致应用出错。可以由容器管理单例的生命周期得以解决,比如Java EE容器、sping容器
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)