`
zhaixf2001
  • 浏览: 25473 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

一段单例模式的代码

阅读更多
class ConnectionPoolManager {

    private static final Object LOCK = new Object();

    private static ConnectionPoolManager connectionPoolManager = null;

    public static ConnectionPoolManager getInstance() {
        //这里有两次判断,我理解为减少不必要的同步开销
        if (connectionPoolManager == null) {
            synchronized (LOCK) {
                if (connectionPoolManager == null) {
                    connectionPoolManager = new ConnectionPoolManager();
                }
            }
        }
        return connectionPoolManager;
    }
    
    private ConnectionPoolManager(){
        super();
    }

}



感谢一下下面这个哥们的提醒。
分享到:
评论
4 楼 w8y56f 2011-10-14  
我觉得第一个if判断是为了提高效率,如果ConnectionPoolManager 是null了才会进入条件,否则直接return了,可以越过同步代码块。第二个if条件判断确实是像上面的老兄说的那样,是为了安全,否则可能实际上并不止new了一个ConnectionPoolManager ,当然new了这么多个ConnectionPoolManager,但是只有一个不会被GC回收,就是被变量connectionPoolManager 引用的这个。


另外这个方法确实是比把synchronized直接加在方法上效率要高
3 楼 zhaixf2001 2009-09-09  
walsh 加一个私有的构造方法确实是必须的,防止通过new 的方式直接生成一个实例。

关于第一点,里面的if判断肯定是必须的,而同步lock外面的那次判断是在不加的情况下也能达到单例的效果,不过开销太大。
2 楼 walsh 2009-09-06  
还有,你这段代码,根本就不是单例模式。

你这样写,并不能保证在应用中只有一个实例,因为你用的是默认构造方法。

应该在你的类中加上一个private的构造方法,那样才能算得上是单例模式。
1 楼 walsh 2009-09-06  
引用
//这里有两次判断,我理解为减少不必要的同步开销  
        if (connectionPoolManager == null) {  
            synchronized (LOCK) {  
                if (connectionPoolManager == null) {  
                    connectionPoolManager = new ConnectionPoolManager();  
                }  
            }  
        } 



其实这里做两次判断并不仅仅是为了减少同步开销,是另有原因的,一个重要的原因就是在多线程中保证该实例唯一。

如果把synchronized代码块中的,那个if判断去掉,就会出现问题,就有可能在一个多线程应用中创建不止一个connectionPoolManager实例。


举个简单的例子:
如果线程Thread_1和Thread_2同时竞争lock锁,假如Thread_1获得了lock锁,那么Thread_2就要在synchronized (LOCK) 这行代码处等待,当Thread_1实例化对象之后,退出同步代码块,释放了lock锁,这个时候,Thread_2获得了lock锁,从而进入同步代码块,如果这个时候,没有那个if判断,对于thread_2来说,它还是认为connectionPoolManager为空(从第一个if可知),所以还会new一个connectionPoolManager对象。

这样就不是单实例了。

相关推荐

    单例模式代码

    总的来说,单例模式是一种常用的软件设计模式,它在特定场景下能有效优化系统资源的使用和提高代码的可维护性。然而,使用时需谨慎,避免滥用导致代码的复杂性和扩展性降低。在实际编程中,应根据具体需求选择合适的...

    设计模式——单例模式(懒汉模式)

    下面是一个简单的DCL实现的懒汉式单例模式代码示例: ```java public class Singleton { private volatile static Singleton instance; // 使用volatile关键字防止指令重排序 private Singleton() {} public ...

    IOS官方标准_单例模式

    单例模式是软件设计模式中的一种,它在iOS开发中被广泛应用,特别是在管理全局资源、配置或者需要跨类共享的对象时。单例模式的核心思想是确保一个类只有一个实例,并提供一个全局访问点,使得所有对象都可以通过这...

    单例模式讲解说明与实例

    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。 ...

    设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)

    单例模式是软件设计模式中的一种基础且广泛应用的模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、配置对象、缓存等场景下非常常见,因为它可以避免因频繁创建和销毁对象而...

    【JavaScript源代码】JS实现单例模式的6种方案汇总.docx

    JavaScript中的单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一实例。这种模式在JavaScript开发中非常有用,尤其是在处理全局变量、避免命名冲突、节省内存以及统一接口等...

    多线程单例模式并发访问

    单例模式是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 - **饿汉式**:在类装载时即完成初始化,避免了线程同步的问题。 - **懒汉式**:通过静态内部类或者双重检查锁定的方式来...

    单例 单例模式.txt

    单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式通常用于那些需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源(如磁盘空间、内存或网络...

    unity中涉及的三种单例模式

    在Unity游戏开发中,单例模式是一种常用的编程设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在处理需要跨场景共享数据的情况时尤其有用,因为Unity的场景切换可能导致对象被销毁,而单例则...

    单例模式与双重检测

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、日志记录、线程池管理等,确保了资源的有效管理和高效利用。...

    单例模式与垃圾回收机制

    以下是一段用于测试单例对象是否会成为垃圾回收目标的示例代码: ```java class Singleton { private byte[] a = new byte[6 * 1024 * 1024]; // 分配6MB内存 private static Singleton singleton = new ...

    连接池单例代码

    本文将详细解析一个基于Apache Commons DBCP实现的数据库连接池单例模式代码。 #### 二、基础知识回顾 1. **连接池**:连接池是一种用于管理数据库连接的技术,它预先创建一定数量的数据库连接并存储在一个池中,当...

    单例模式的各个版本

    单例模式是软件设计模式中的一种,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在Java、C#等面向对象编程语言中,单例模式被广泛应用,尤其在处理系统级资源如数据库连接池、缓存管理时。单例模式...

    单例模式中声明静态自己类型的指针编译显示未定义处理

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁的对象,或者需要共享资源的情况下非常有用。然而,实现单例模式时,...

    深入理解JavaScript系列(25):设计模式之单例模式详解

    单例模式是软件开发中一种非常重要的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在JavaScript这样的动态语言中,单例模式的实现方式很多样,而且可以非常灵活。下面,我们就来深入探讨单例模式在...

    ios demo,dispatch_once,单例模式的应用

    在iOS开发中,`dispatch_once`和单例模式是两种重要的设计模式和技术,它们在确保代码执行的线程安全和管理全局唯一实例方面起到关键作用。让我们深入探讨这两个概念及其在实际应用中的工作原理。 首先,`dispatch_...

    Delphi-Singleton.rar_delphi_delphi单例模式

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在 Delphi 中,实现单例模式同样重要,因为它在控制资源、管理共享对象或者在整个应用程序生命周期内仅需实例化一次的对象时非常...

    C# 单例模式详解与线程安全性实现

    内容概要:本文详尽地阐述了 C# 中单例模式的设计思想以及其实现方式,并且特别针对单例模式的线例安全提供了多种解决方案,包括锁(lock),最终给出了一段非线程安全和一段线程安全版本的代码供参考。 适合人群:C# ...

Global site tag (gtag.js) - Google Analytics