标签:线程池 性能 get 解决 方便 必须 java设计 应用 单例模式
单列模式可以说是java设计模式中最常见的一种了,下面来聊下我对这个设计模式的一些认识吧
一、单例模式的定义 “
Java中单例模式的定义是:“一个类有且仅有一个实例,并且自行实例化向整个系统提供”。,具体说来就是一下3点。1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。
二、单例模式的优缺点
优点:(1) 由于单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建销毁时,而且创建或销毁时性能又无法优化,单例模式就非常明显了
(2) 单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作
(3)单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。
缺点:(1) 单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
三、单例模式的应用场景
(1).资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2).控制资源的情况下,方便资源之间的互相通信。如线程池等。
四,单例模式的实现
主要分两种,恶汉和懒汉,具体实现起来也有各种不同的方式
恶汉,采用静态常量的方式(也可使用静态块的方式),实现简单,类装载时就将对象实例化了,避免了同步时的风险,但如该对象未被使用,浪费了内存
public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } }
懒汉,在第一次使用该类的时候创建对象,但是存在同步问题,导致创建多个实例
public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
懒汉,避免了上一种方式带来的同步问题,但是加锁的同时也让效率变得很低
public class Singleton { private static Singleton singleton; private Singleton() {} public static synchronized Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
懒汉,双重检查,同样解决了同步问题,但是加锁的位置不同,效率较高,只会在初始化时面临同步竞争锁的情况
public class Singleton { private static volatile Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
标签:线程池 性能 get 解决 方便 必须 java设计 应用 单例模式
原文地址:https://www.cnblogs.com/Lliuyao/p/10166535.html