工作也有一年多的时间了,这一年有喜也有忧,不过不管怎么说换了工作换了环境就得好好干,新的开始新的天地!呵呵。。。
旧的一年里技术上没有什么大的长进,就设计模式来说吧,工作中用到过但是始终不知道不理解 到底是怎么回事,管理以及团队配合上是学习不少,这都要感谢我去年的头(说实在的真的很佩服他!)
现在有了些时间好好地回顾了一下,在此就把自己的理解以作为备忘,同时也希望能帮助其他的人。好了不多说了,直接说单例吧!
public class Singleton {
private Singleton instance = null;
private Singleton(){}
public Singleton getIntance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
可以看到上面这就是一个简单的单例,和我们日常用到的其他类相比 单例的标准我们看到
了,他的 构造函数 必须是私有的(不然的话外界引用的时候就可以实例化了) 其次 我们要提供一个能实例化自身并且返回给调用者的这样一个方法!
可以看到上面的这个实例很简单,但是问题出现了如果我们加入了线程怎么办?
比如现在我们有一个需求需要一边读log一边写 怎么办? log当然是个单例了。。。。
这个时候问题出现了。。如果读写可能要发生冲突了怎么办?
当然是使用线程同步了。。
伪代码如下:
public class Singleton {
private Singleton instance = null;
private Singleton(){}
public Singleton synchronized getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
呵呵问题解决了,但是似乎隐藏的问题 被你看到了!的确,性能的确有问题,
但是 我们该如何来改进呢?
下面给出方案
第一种解决性能问题的方案:就是尽量减少你程序中使用该类的getInstance()方法
当然了 这绝对不是最优的方法
第二种解决方案:使用急切式的方法(前提是应用程序 频繁的使用或者创建单例,或者创建和运行时的负担不重)
public class Singleton{
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
第三种解决方案:
使用双重检查锁(DCL)的形式:
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance == null){
synchronized(Singleton.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
}
}
第三种方案只有在第一次创建的时候才会同步,这样的话我们的性能相比较之前的会有很大的提升。
虽然给出了这三种方案,但是我还是有疑惑的地方比如在 第一种和第二种解决方案上面 我有些问题
可以看到 如果我们担心性能问题 那么就不能使用同步了,那么是不是同步问题和性能兼容上面我们只能选择第三种解决方案呢?希望哪位前辈 能再详细的解释一下啊!
分享到:
相关推荐
单例模式的七种实现方法以及分析,可以作文大作业提交 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 2.2IDEA简介 4 3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量...
设计模式的研究以及单例模式的应用与实现,王晓满 ,张展华,本文介绍了设计模式在软件设计中的重要作用和意义,然后给出了设计模式的定义和基本要素,在此基础之上分析了怎样使用设计模式来
前两年IOS应用源码-主要是用于毕业设计学习的。
软件设计模式是可重用的设计,为软件开发中的类似问题提供通用解决方案。 创建模式是一类设计模式,它有助于创建、组合和表示对象。 它们从客户端抽象对象的创建,从而使应用程序更能适应未来的需求变化。 在这项...
1.完成对不同类型...4. 包含以下设计模式中的四种:工厂、单例、合成、装饰器、适配器、责任链、对象缓存器、观察者,或自己提炼一种设计模式 5.引入一种MVC结构的框架或成熟的中间件的一种或按照MVC的思想设计。
在业务层则是采用单例模式设计与Spring的IoC模式相结合,实现了公共代理类的编写,各业务逻辑接口的封装。而在持久层的设计中则是采用基于现有持久层框架的实现模式,实现了对产生Session实例的封装,对常用数据库...
在业务层则是采用单例模式设计与Spring的IoC模式相结合,实现了公共代理类的编写,各业务逻辑接口的封装。而在持久层的设计中则是采用基于现有持久层框架的实现模式,实现了对产生Session实例的封装,对常用数据库...
15.2 单例模式的结构.........................222 15.3 在什么情况下使用单例模式.....228 15.4 单例类的状态.............................229 15.5 一个实用的例子:属性管理器.230 15.6 Java 语言中的单例模式.....
在业务层则是采用单例模式设计与Spring的IoC模式相结合,实现了公共代理类的编写,各业务逻辑接口的封装。而在持久层的设计中则是采用基于现有持久层框架的实现模式,实现了对产生Session实例的封装,对常用数据库...
在业务层则是采用单例模式设计与Spring的IoC模式相结合,实现了公共代理类的编写,各业务逻辑接口的封装。而在持久层的设计中则是采用基于现有持久层框架的实现模式,实现了对产生Session实例的封装,对常用数据库...
综上所述,“认我测”在线认证检测系统,率先填补了认证检测领域移动端的空缺,提供了Web浏览器+移动端的双端访问模式,给用户提供了多种访问途径,真正实现了用户和检测机构的随时随地在线下单检测。 关键词:...
MySQL 工具来开发, 主要采用 MVC、单例、观察者等设计模式。 安卓端主要分为首页、攻略、发布、商城、“我的”模块,各个模块实现不同的功能, 不仅能够获取桂林最多最快最全的旅游信息,还能浏览时事新闻头条、...
JavaScript设计模式 这是《》一书中描述的。 随意进行分叉和更新。 以下DP已实现: 模块模式 观察者模式 单例模式
基于Entity Framework框架设计一个典型MVC架构中的数据库访问层,运用Entity Framework框架中的Code First方式结合泛型、封装、单例模式等技术,实现实体类映射到数据库表并自动往数据库建表的功能,并对每个实体类...
形态适应出于我的Msc论文文档的目的,该存储库保存了形态适应库的冻结克隆。展示柜特征展示并利用了四个级别来提取论文中记录的结果。 每个环境中都有一个Simulation Manager单例,它... 仿真模式:除非显示结果,否则
不同于书本和培训课程中所提的单例模式,真正的企业具有非常复杂的数据架构。大多数数据将会存储于大型遗留或打包的系统中,数据结构的细节对于这些系统来说可能是不可见的。其他数据将存储于电子表格和个人数据库...
8.18 真正的单例模式 186 8.19 真正的迭代器模式 186 8.20 真正的工厂模式 187 8.21 真正的门面模式 187 8.22 真正的命令模式 188 8.23 真正的模板方法模式 188 8.24 真正的适配器模式 188 8.25 业务与逻辑分开 189 ...