注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

java设计模式(单例模式)  

2015-07-01 10:55:47|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前端时间做项目的时候,获取某个对象的时候经常看到getInstance(),查看源码发现就寥寥几句代码,感觉很简单
查了些资料,原来发现这玩意还有很多学问



一、作用   
保证一个类仅有一个实例,并提供一个访问它的全局访问点

二、适用场景

1. 应用中某个实例对象需要频繁的被访问。

2. 应用中每次启动只会存在一个实例。如账号系统,数据库系统。


三、使用方式

1、大众式

public class Singleton {

/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */
private static Singleton instance = null;

/* 私有构造方法,防止被实例化 */
private Singleton() {
}

/* 1:懒汉式,静态工程方法,创建实例 */
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

优点:延迟加载(需要的时候才去加载)

缺点: 线程不安全,在多线程中很容易出现不同步的情况,如在数据库对象进行的频繁读写操作时。


2、加同步锁

public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}

优点:解决了线程不安全的问题。

缺点:效率有点低,每次调用实例都要判断同步锁


3、双重检验锁

/*3.双重锁定:只在第一次初始化的时候加上同步锁*/
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}

优点:解决了同步效率问题

缺点:instance = new Singleton();说这句在JVM编译过程中会出现指令重排的优化过程。会导致当 instance实际上还没初始化,就可能被分配了内存空间,也就是说会出现 instance !=null 但是又没初始化的情况,这样就会导致返回的 instance 不完整。还是不明白,反正适合在并发量不多,安全性不太高的情况下使用


4、懒汉式

public class Singleton {

private static Singleton instance = new Singleton (); 


public static SingletonD getInstance() {  

return instance;    

}

优点:不会出现并发及线程问题(java中class加载时互斥的

缺点:带参数及配置文件无法使用


5、内部类的实现(推荐)

public class SingletonInner {

/**
* 内部类实现单例模式
* 延迟加载,减少内存开销
*
* @author xuzhaohu
*
*/
private static class SingletonHolder {
private static SingletonInner instance = new SingletonInner();
}

/**
* 私有的构造函数
*/
private SingletonInner() {

}

public static SingletonInner getInstance() {
return SingletonHolder.instance;
}

protected void method() {
System.out.println("SingletonInner");
}
}

优点:延迟加载,线程安全(java中class加载时互斥的),也减少了内存消耗



  评论这张
 
阅读(38)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018