工作也有一年多的时间了,这一年有喜也有忧,不过不管怎么说换了工作换了环境就得好好干,新的开始新的天地!呵呵。。。
旧的一年里技术上没有什么大的长进,就设计模式来说吧,工作中用到过但是始终不知道不理解 到底是怎么回事,管理以及团队配合上是学习不少,这都要感谢我去年的头(说实在的真的很佩服他!)
现在有了些时间好好地回顾了一下,在此就把自己的理解以作为备忘,同时也希望能帮助其他的人。好了不多说了,直接说单例吧!
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();
}
}
}
}
}
第三种方案只有在第一次创建的时候才会同步,这样的话我们的性能相比较之前的会有很大的提升。
虽然给出了这三种方案,但是我还是有疑惑的地方比如在 第一种和第二种解决方案上面 我有些问题
可以看到 如果我们担心性能问题 那么就不能使用同步了,那么是不是同步问题和性能兼容上面我们只能选择第三种解决方案呢?希望哪位前辈 能再详细的解释一下啊!
分享到:
相关推荐
### 单例模式详解 #### 一、设计模式概述 设计模式是一种在软件工程领域内广泛应用的方法论,它提供了一套解决常见问题的有效方案。设计模式可以看作是前辈们在实践中积累下来的经验总结,这些模式经过长时间的...
在iOS应用开发中,单例模式是一种常用的编程设计模式,它确保了类只有一个实例,并提供一个全局访问点。这个模式在iOS开发中的应用非常广泛,特别是在处理系统资源、网络请求、数据存储等需要全局共享的对象时。在...
创建型模式主要关注对象的创建过程,如单例模式、工厂模式和抽象工厂模式等,它们为对象的创建提供了一种封装机制,使得代码更易于管理和扩展。结构型模式则关注如何将类或对象组合成更大的结构,例如适配器模式、...
- **解析**:单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于管理资源密集型的对象,如数据库连接、线程池等。通过确保此类对象在整个系统中只存在一个实例,...
创建型设计模式包括工厂方法模式、抽象工厂模式、原型模式、单例模式、建造模式等。结构型设计模式包括合成模式、装饰模式、代理模式、享元模式、门面模式、桥梁模式等。行为型设计模式包括模版方法模式、观察者模式...
1. 单例模式:确保一个类只有一个实例,并提供全局访问点。它常用于控制资源的共享,如日志服务或线程池。 2. 工厂模式:提供一个创建对象的接口,让子类决定实例化哪一个类。它封装了对象的创建过程,提高了代码的...
单例模式常用于配置文件管理、线程池或数据库连接等场景,确保在整个应用程序中只有一个共享的实体。 2. **工厂模式(Factory Method)** 工厂模式定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。它...
1. 创建型模式(Creational Patterns):如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们主要处理对象的创建,帮助...
创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory)等。结构型模式处理类和对象的组合与封装,如适配器模式(Adapter)、装饰器模式...
1. 创建型模式:这类模式主要关注对象的创建,例如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们提供了一种方式来...
设计模式通常分为三类:创建型模式(如单例模式、工厂模式、抽象工厂模式)、结构型模式(如适配器模式、代理模式、装饰器模式)和行为型模式(如观察者模式、职责链模式、策略模式)。 2. **单例模式**: 单例...
总结来说,本文档通过介绍单例模式在多核多线程环境下的性能提升方法,探讨了Java设计模式在现代大型系统应用中的优化策略,并对JDK未来的设计模式实现提出期望,为Java开发人员提供了宝贵的技术指导和参考。
单例模式是一种常用的创建型模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式适用于那些在整个系统中只需要一个实例的类,比如配置管理器、日志记录器等。 **实现** 实现单例模式的...
在框架中,如数据库连接或缓存管理,通常会用到单例模式,以保证在整个应用中只有一份资源实例。 2. 工厂模式:提供创建对象的接口,但不指定具体类型。在PHP框架中,控制器、模型或视图的创建常由工厂模式处理,以...
- **单例模式** - **建造者模式** - **原型模式** 2. **结构型模式**:关注的是如何将类或对象组合成更大的结构,同时保持结构的灵活性。 - **适配器模式** - **桥接模式** - **组合模式** - **装饰模式** ...
创建型模式关注对象的创建,例如单例模式(Singleton)和工厂模式(Factory)。行为型模式主要处理对象间的行为和责任分配,如观察者模式(Observer)和策略模式(Strategy)。结构型模式则涉及对象的组合和结构,...
包括单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 - **结构型模式**:关注对象间的组合,提供更简单的接口来定义结构化的组合。包括适配器模式、装饰模式、桥接模式、组合模式、外观模式、享元...