`
xiaoqulai
  • 浏览: 75866 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
han
文章分类
社区版块
存档分类
最新评论

我理解的单件模式

阅读更多
性能、安全最好的单件书写模式
public class Singleton{

//volatile 仅仅在JDK5+有效,跟同步块synchronized一起使用,可提高同步性能。如果读操作远远超过写操作,可以结合使用内部锁和 volatile 变量来减少公共代码路径的开销
    private volatile static Singleton test;

    private Singleton(){}

    public static Singleton getInstance(){
        if(test == null){
            synchronized(Singleton.class){
                if(test==null){
                    test = new Singleton();
                }
            }  
        }
        return test;
    }
}

注意: 1.单件必须保证使用同一个类加载器
         2. jdk1.2中的单件在无引用的情况下会被垃圾回收
         3. 单件类中必须使用静态变量,因为方法是静态的,而且方法必须是静态的
分享到:
评论
6 楼 xiaoqulai 2009-08-14  
这样写的一个缺点是把变量实例化的全新交给了系统,有时候就算不调用,也会实例化,还有,如果实例化后还需要很多操作,才算产生一个真正的实例,这样也是不行的。

nextway.cn 写道
推荐看看这篇文章《双重检查锁定及单例模式》:
http://www.ibm.com/developerworks/cn/java/j-dcl.html

线程安全的单例模式
public class Singleton{
  private static Singleton instance = new Singleton();

  private Singleton(){
  }

  public static Singleton getInstance(){
    return instance;
  }
}

5 楼 xiaoqulai 2009-08-14  
有很大区别的,放在方法提上会让影响效率的,一个synchronized锁会让一个方法调用的效率降低100倍,放在方法体上同步会让每次调用都要采取同步机制,放在里面那样写,只有第一次并发需要同步,以就不需要同步了。

01404421 写道
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢

4 楼 xiaoqulai 2009-08-14  
有很大区别,做JVM有很多公司有很多,这其中有不少JVM是不支持volatile的(在JDK5之前),会导致双重枷锁失效,建议你听听你楼下的那位朋友的说法。

这种写法不是莫名其妙,好好研究~~

metaphy 写道
引用
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢

这个例子来看没有区别,都是对getInstance()加锁
并且
引用
        if(test == null){
            synchronized(Singleton.class){
                if(test==null){
                    test = new Singleton();
                }
            }  
        }

这种写法真的是莫明其妙的感觉

P.S.
volatile在JDK1.2就有了,何来只在JDK 5有效一说?
the modifier volatile is included for some of the member variables. By indicating that a member variable is volatile, you inform the JavaVM that its value might be changed by one thread while being used by another.

3 楼 nextway.cn 2009-08-14  
推荐看看这篇文章《双重检查锁定及单例模式》:
http://www.ibm.com/developerworks/cn/java/j-dcl.html

线程安全的单例模式
public class Singleton{
  private static Singleton instance = new Singleton();

  private Singleton(){
  }

  public static Singleton getInstance(){
    return instance;
  }
}
2 楼 metaphy 2009-08-14  
引用
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢

这个例子来看没有区别,都是对getInstance()加锁
并且
引用
        if(test == null){
            synchronized(Singleton.class){
                if(test==null){
                    test = new Singleton();
                }
            }  
        }

这种写法真的是莫明其妙的感觉

P.S.
volatile在JDK1.2就有了,何来只在JDK 5有效一说?
the modifier volatile is included for some of the member variables. By indicating that a member variable is volatile, you inform the JavaVM that its value might be changed by one thread while being used by another.
1 楼 01404421 2009-08-14  
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢

相关推荐

    c++实现单件模式 c++实现单件模式 c++实现单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在软件开发中被广泛应用,比如配置管理、数据库连接池、日志服务等场景,需要确保全系统...

    设计模式_--_工厂模式和单件模式

    ### 设计模式——工厂模式与单例模式 #### 一、引言 设计模式是软件工程领域中的一个重要概念,它代表了在特定情况下解决常见问题的最佳...通过理解这两种模式,开发者可以在实际项目中更加灵活地进行设计和编码。

    基于C#的设计模式中的单件模式

    单件模式(Singleton Pattern)是软件设计模式中的一种基础模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式的实现有多种方式,包括懒汉式、饿汉式以及线程安全的实现。下面我们将详细讨论...

    C#设计模式,单件模式,C#代码

    本资源旨在帮助初学者理解并应用单件模式,通过关键代码实例,让你快速掌握这一重要的设计原则。 单件模式是一种创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这个模式在许多场景...

    设计模式\单件模式VS2005

    单件模式(Singleton Pattern)是软件设计模式中的一种经典模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接等需要全局唯一的...

    [创建型模式] head first 设计模式之单件模式(Singleton)

    **单例模式(Singleton)**是软件设计模式中的一种创建型模式...阅读这本书籍可以帮助开发者更好地理解和运用设计模式,提高代码质量和可维护性。在阅读过程中,结合示例代码进行实践,将更有利于掌握这些模式的精髓。

    单件模式demo

    单件模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以避免因对象创建和销毁带来的开销,同时...

    设计模式之单件模式、工厂模式、策略模式、观察者模式(php描述)(资料整理)

    首先,我们来看单件模式。单件模式确保一个类只有一个实例,并提供一个全局访问点。在PHP中,由于其动态性,实现单例时需要特别注意防止多个实例的产生。通常,我们会定义一个私有静态成员变量来保存实例,同时提供...

    线程池 + 工厂模式 + 工厂方法 + 单件模式

    线程池、工厂模式、工厂方法和单件模式是软件设计中常见的模式,它们在构建高效、可扩展的系统中发挥着关键作用。此外,内存池的概念也与资源管理紧密相关,尤其在处理大量对象创建时能提升性能。下面将分别详细介绍...

    C++设计模式课件12_Singleton_单件模式.pdf

    ### 单件模式(Singleton Pattern)详解 #### 概述 单件模式是软件设计模式中最为基础且应用广泛的一种模式。它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。此模式通常用于那些需要频繁创建、消耗...

    单件模式的C++标准实现.docx

    单件模式(Singleton Pattern)是一种常用的软件设计模式,它的主要意图是确保一个类只有一个实例,并提供一个全局访问点。在C++中,实现单件模式通常涉及到类的静态成员和私有构造函数的使用,以防止用户直接创建类...

    c#工厂模式——简单工厂,抽象工厂,单件模式实例

    在软件设计模式中,工厂模式是一种非常常见的创建型模式,它提供了一种创建对象的最佳方式。C#中的工厂模式分为简单工厂、抽象工厂和单例...理解并熟练运用这些设计模式,对于提升C#软件开发的专业性和效率至关重要。

    .NET中的单件模式的使用

    单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它确保一个类只有一个实例,并提供一个全局访问点。在.NET框架中,单例模式的应用非常广泛,特别是在需要频繁实例化然后销毁的对象,或者创建对象需要...

    as3 设计模式 单件模式 源码

    首先,让我们理解单例模式的基本结构。一个单例类有两个关键特征:一是防止其他对象实例化它,二是提供一个全局访问点来获取唯一的实例。在AS3中,我们可以通过以下方式实现: ```actionscript public class ...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    在提供的"1.Singleton 单件(创建型模式).wmv"视频文件中,可能详细讲解了Singleton模式的概念、实现方式、优缺点以及在C#中的具体应用实例,包括如何在实际项目中适当地使用和避免滥用Singleton模式。观看该视频可以...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    设计模式之我见(1):设计模式概述 (100%) 设计模式面面观(2):设计模式基本要素与原则 (100%) 设计模式面面观(3):单件模式(Singletion)-创建型模式 (100%) 设计模式面面观(4):工厂模式...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

    标题和描述均聚焦于"C#面向对象设计模式"之中的"Singleton单件(创建型模式)",这是一种在软件工程领域广泛运用的设计模式,其核心在于确保一个类只有一个实例,并提供一个全局访问点,以实现资源的有效管理和控制。...

    php单件模式下的数据库连接类

    首先,理解单例模式的基本原理是关键。单例模式的主要特点包括: 1. **私有化构造函数**:防止外部代码通过常规方式创建类的实例。 2. **静态方法**:提供一个静态方法,作为获取类实例的唯一入口,通常命名为`...

    1.单件设计模式.rar

    单例设计模式是一种常用的设计模式,它在软件工程中用于保证一个类只有一个实例,并提供一个全局访问点。...通过学习这些案例,你可以更深入地理解C++中的单例设计模式,以及如何在实际项目中应用和优化。

    深入浅出设计模式中文版前六章

    《深入浅出设计模式》是一本深受欢迎的设计模式教程,其中文版的前六章涵盖了多个核心的设计模式,包括工厂模式、单件模式以及命令模式等。这些模式是软件开发中不可或缺的基础,对于提升代码质量和可维护性具有重大...

Global site tag (gtag.js) - Google Analytics