单例:单一个实例(Instance)。Singleton的英文意义是独身,也就是只有一个人,应用在面向对象语言上。Singleton模式可以保证一个类别 只有一个实例,并只提供一个访问这个实例的方法getInstance()。
1.饿汉式:就是一开始就初始化好了实例,getInstance()的时候直接返该实例。
package com.broada.panjie.entity; /** * 饿汉式单例模式 * @author panjie */ public class HungerSingleton { /** * 一开始就初始化好了实例 */ private static HungerSingleton instance = new HungerSingleton(); private HungerSingleton(){//私有化构造器 } public static HungerSingleton getInstance(){ return instance; } }
2.懒汉式:即延缓加载式(Lazy Initialization),需要的时候才创建实例。
package com.broada.panjie.entity; /** * 懒汉式单例模式 * @author panjie */ public class LazySingleton { /** * 一开始不先创建一个实例 */ private static LazySingleton instance = null; private LazySingleton(){ //私有化构造器 } public static LazySingleton getInstance(){ if(instance==null){ instance = new LazySingleton(); } return instance; } }
二、多线程单例模式
1.简单多线程单例模式:
接下来我们就会碰到多线程的单例问题,最简单的解决方法就是在getInstance()方法前加锁。
public class Singleton { private static Singleton instance = null; private Singleton(){} public synchronized static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
2.双重检查单例模式(Double-check Locking):
因为加锁的同步机制会造成性能上的低效。为了顾及Singleton、Lazy Initialization与效能问题,于是又有了双重检查单例模式(Double-check Locking)。
public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance() { if (instance == null){ synchronized(Singleton.class){ if(instance == null) { instance = new Singleton(); } } } return instance; } }