单例模式:
确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
其要点:
- 类的实例只能有一个
- 类的实例是自行创建的
- 类自行向整个系统提供所创建的该实例
应用场景:多个客户可共享一个单例对象;一些资源管理器常设计成单例模式;单例类局限于某个JVM当中,如果在分布式系统中,而且这个单例类是有状态的,则不适用。同一个JVM中,当有多个类加载器同时加载同一个类时,应尽量避免使用有状态的单例类
饿汉式单例模式和懒汉式单例模式
两者的区别在于,
饿汉式是在类加载时就创建了对象实例,因而容易造成资源消耗率高,但它的响应时间是比懒汉式快的。
而懒汉式则是在单例类第一次被引用时创建对象实例,因而对资源的利用率更高,但要处理多个线程同时首次引入该单例类的访问限制问题
饿汉式:
/**
* @author : Jack Wu
* @Title: EagerSingleton
* @ProjectName test_project
* @Description: 饿汉式单例模式
* @date 2019/2/24 13:37
*/
public class EagerSingleton {
private static EagerSingleton eagerSingleton=new EagerSingleton();
private EagerSingleton(){
System.out.println("eagerSingleton constructor method");
}
public static EagerSingleton getEager(){
return eagerSingleton;
}
}
懒汉式的单例模式:
/** * @author : Jack Wu * @Title: LazySingleton * @ProjectName test_project * @Description: 懒汉式的单例模式 * @date 2019/2/24 13:42 */ public class LazySingleton { private static LazySingleton lazySingleton=null; private LazySingleton(){ System.out.println("LazySingleton contructor method"); } synchronized public static LazySingleton getLazySingleton(){ if (lazySingleton==null){ return lazySingleton=new LazySingleton(); }else return lazySingleton; } }