线程安全的单例模式的几种实现
单例模式是常见的设计模式之一:目的是节省内存,限制了实例的个数;有利于java GC回收机制。
单例模式的三个好处:
1.控制资源的使用,通过线程同步来控制资源的并发访问
2.控制实例的产生个数,来达到节约资源的目的
3.作为通信媒介使用,在不建立连接的情况下,让两个不先关的进程和线程之间实现通信
单例模式分类: 饿汉模式(在类加载时便会创建对象);
懒汉模式(在外部第一次请求实例时才会创建实例);
登记式模式
单例模式特点:
1.单例类只有一个实例
2.单例类必须自己创建自己唯一的实例
3.单例类必须自己给其他类提供这一实例
1.懒汉模式:类加载时不会初始化,当外部第一次请求实例时才会创建实例;而且第一次创建后不在创建该实例;
特点是:运行时获取对象的速度比较慢,但加载的时候比较快,它在整个生命的应用周期只占用一部分资源
//单例模式-懒汉式单例 public class LazySingleton { //私有静态对象,加载时候不做初始化 private static LazySingleton jjy=null; // 私有构造方法,避免外部创建实例 private LazySingleton(){} /** * 静态工厂方法,返回此类的唯一实例. * 当发现实例没有初始化的时候,才初始化. * @return LazySingleton */ synchronized public static LazySingleton getJjy(){ if(jjy==null){ jjy=new LazySingleton(); } return jjy; } }
2.饿汉模式:类加载时就会初始化,创建实例;
特点是:运行时获取对象速度比较快,但加载时速度比较慢,会一直占用资源 (程序打开加载比较慢,但运行速度快---从用户体验角度来说推荐饿汉)
//单例模式-饿汉式单例
public class EagerSingleton {
//私有静态对象,加载时候不做初始化
private static EagerSingleton jjy=new EagerSingleton();
// 私有构造方法,避免外部创建实例
private EagerSingleton(){}
/**
* 静态工厂方法,返回此类的唯一实例.
*
*
*/
synchronized public static EagerSingleton getJjy(){
return jjy;
}
}
使用场景:数据库连接池;网站计数器;