1、单例模式
确保一个类最多只有一个实例,并提供一个全局访问点程序员
2、为何会须要单例
有些对象咱们只须要一个:线程池、缓存、硬件设备等
若是多个实例会有形成冲突、结果的不一致性等问题
是否能够用静态变量方式来实现?
或者程序员之间协商个全局变量?
3、单例模式的实现/**设计模式
*/
public class Singleton {缓存
private static Singleton uniqeInstance = null; private Singleton() { } // 利用静态方法和静态变量实现简单的单例 public static Singleton getInstance() { if (uniqeInstance == null) { uniqeInstance = new Singleton(); } return uniqeInstance; }
}
4、单例模式的优化安全
多线程的状况下为保证线程安全,须要对单例模式进行优化处理多线程
优化方式:优化
1.同步(synchronized)getInstance方法
public static synchronized ChocolateFactory getInstance() {线程
if (uniqueInstance == null) { synchronized (ChocolateFactory.class) { if (uniqueInstance == null) { uniqueInstance = new ChocolateFactory(); } } } return uniqueInstance; }
该方法利用synchronized关键字加了同步锁,可是比较耗资源,每次都得加锁设计
2.“急切”建立实例
public class ChocolateFactory {code
private boolean empty; private boolean boiled; public static ChocolateFactory uniqueInstance = new ChocolateFactory(); private ChocolateFactory() { empty = true; boiled = false; }
}
该方法在程序启动的时候就建立了一个对象,就算无调用也建立了,耗内存空间对象
3.双重检查加锁(最优)
public class ChocolateFactory {
private boolean empty; private boolean boiled; public volatile static ChocolateFactory uniqueInstance = null; private ChocolateFactory() { empty = true; boiled = false; } public static ChocolateFactory getInstance() { if (uniqueInstance == null) { synchronized (ChocolateFactory.class) { if (uniqueInstance == null) { uniqueInstance = new ChocolateFactory(); } } } return uniqueInstance; }
}
利用volatile关键字和双重验证以及同步锁,即保证了内存的合理分配和原子性,也无需每次都加上同步锁
Java设计模式全部示例代码,持续更新中