java 单例模式

来源:互联网 发布:fm2016经典球星数据库 编辑:程序博客网 时间:2024/06/16 07:45
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
(Servlet类被设计成单例,被所有线程共享!)
单例模式的好处有三点:
1:控制实例产生的数量,达到节约资源的目的,有利于java垃圾回收
2:控制资源的使用,通过线程的同步来控制资源的并发访问
3:作为通信的媒介,也就是数据共享,他可以在不建立直接关联的情况下,让多个不想关的线程或进程之间实现通信




单例模式的特点是:
1、单例类只有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须给所有其他对象提供这一实例


缓存、日志、创建比较耗时的往往可以设计成单例


单例模式的集中比较常见的实现方式:
1:懒汉式单例: 
优点 实现了延迟加载   
但在多线程的环境下如果不同步getInstance方法会有线程安全问题,如果同步getInstance方法
编程串行执行  降低效率


只有在第一次调用方法时才需要同步。由于只有第一次调用执行了new LazySingleTon();而只有此行代码需要同步,因此就无需对后续调用使用同步。所有其他调用仅判断instance是非null的,并将其返回。多线程能够安全并发地执行除第一次调用外的所有调用。尽管如此,由于该方法是 synchronized的,需要为该方法的每一次调用付出同步的代价,
/**
 * 懒汉式
 * 构造器私有化   :子类就不能调用父类的构造器  子类就不能声明新对象
 * 提供私有的静态属性   :只能本类自己用  切实静态的  只在加载时初始化有且仅有一次
 * 提供公共静态的方法     :可以通过类名调用  获得实例对象
 * @author ren
 *
 */
public class LazySingleTon {
private static LazySingleTon lazySingleTon=null;
private LazySingleTon() {
}

public static synchronized LazySingleTon getInstance(){
if(lazySingleTon==null){
lazySingleTon= new LazySingleTon();
}
return lazySingleTon;
}
}
2:饿汉式单例   优点是 线程安全     缺点是 没有达到延迟加载(lazy loading)的效果 
 public class EagerSingleTon {
private static EagerSingleTon eagerSingleTon=new EagerSingleTon();
private EagerSingleTon() {
}
public static EagerSingleTon getInstance(){
return eagerSingleTon;
}
}


3、双检查机制  优点 在多线程的情况下相对提高了效率 且不会生成两个对象  
 */
class Single{
private static Single single;
private Single(){

}
//double checking 双检查机制  提高效率
public static Single getInstance(){
if(null==single){
//第一次
synchronized(Single.class){
if (null == single) {
single = new Single();
}
return single;
}
}else{
return single;
}
}

}


4、静态内部类方式 
 使用静态内部类  jvm在加载SingleTon_StaticInnerClass时,并不加载它的内部类InnerSingleTon
 而是在调用getInstance方法时  调用InnerSingleTon才加载内部类,从而调用SingleTon_StaticInnerClass的构造方法  
实例化SingleTon_StaticInnerClass   从而在不需要同步的情况下实现延时初始化的效果
public class SingleTon{
private SingleTon(){
}

static class InnerSingleTon{
static SingleTon instance=new SingleTon();
}

public static SingleTon getInstance(){
return InnerSingleTon.instance;
}
}


5、枚举方式   很少有人用




SessionFactory 是单例的   Session不是单例的
0 0
原创粉丝点击