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

单例模式的实现

阅读更多
单例模式的实现需要考虑的因素有很多。对于常常出现的Double-checked实现单例模式实际上是不安全的实现:
private static Singleton INSTANCE;   
public static Singleton getInstance(){   
  if(INSTANCE==null){   
    synchronized(Singelton.class){   
      //Double checking   
      if(INSTANCE==null){   
        INSTANCE=new Singleton();   
      }   
    }   
  }   
}

因为JIT可以在Singleton的构造方法被执行前即回传给INSTANCE一个引用,那么这时其他并发线程可能刚刚好切换到执行权,那么这时的第一次check就得到了这个未经初始化的引用,从而使这个半成品被不合理使用。

一个权威的实现方式是Initialization on Demand Holder (IODH):(懒汉式)
public  class  Singleton  {     
   static  class  SingletonHolder  {    
     static  Singleton instance  =   new  Singleton();      
   }   
     
   public   static  Singleton getInstance()  {      
     return  SingletonHolder.instance;      
  } 
}

可以实现只有需要的时候,才初始化,而且只需要初始化一次。
另外一种方式是:(饿汉式)
public  class  Singleton  {  
public static final Singleton INSTANCE=new Singleton(); 
}

可以保证基本的单例要求。
但是这两种模式依然需要考虑类的加载问题。首先是如果应用中存在各自使用兄弟关系的类加载器的两个线程,各自在运行时调用getInstance,则因为Singleton的类在两个加载器中分别被加载初始化,因此两线程将各自得到不同的实例,出现了在同一个JVM多实例的情况;
另外根据jvm规范12.7 Unloading of Classes and Interfaces的阐释: A class or interface may be unloaded if and only if its class loader is unreachable.即如果类加载器会在应用周期内出现被回收的条件,则该Singleton的类可能被卸载,而后再次getInstance时重新加载,这将造成同一个jvm周期内两次初始化的情况。
因此如果要保证彻底地单例应该考虑类加载器的合理管理。
最后这两种模式也需要考虑序列化的问题。如果单例支持序列化,应该重写readResolve方法。同时要考虑私有化构造方法,以控制其他人直接构造化。


0
0
分享到:
评论

相关推荐

    使用单例模式实现计数器

    以下是一个简单的C#单例模式实现计数器的例子: ```csharp public sealed class Counter { private static readonly Counter _instance = new Counter(); private int _count; // 私有构造函数 private ...

    Qt使用MVC、数据库单例模式实现登录注册

    以下是一个简单的单例模式实现示例: ```cpp class DatabaseManager { public: static DatabaseManager* getInstance() { if (instance == nullptr) { instance = new DatabaseManager(); } return instance; ...

    android SQLite DBHelper 单例模式 实现

    android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);

    php使用单例模式实现mysql类.zip

    下面将详细解释如何在PHP中通过单例模式实现一个MySQL操作类。 首先,我们要理解单例模式的基本结构。单例模式的核心是限制类的实例化过程,只允许创建一个实例。通常,我们通过私有化构造函数来防止直接实例化,...

    单例模式各种实现方式

    以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final Singleton...

    使用Java单例模式实现一个简单的日志记录器.txt

    ### 使用Java单例模式实现一个简单的日志记录器 #### 一、单例模式简介 单例模式是一种常用的软件设计模式,在该模式中,一个类只能创建一个实例,并且提供了一个全局访问点来访问该实例。单例模式的主要优点包括...

    Qt单例模式实现Mysql数据库的链接,增加,删除,修改,查询

    一、单例模式实现 1. 创建单例类:首先,定义一个名为`MySqlConnection`的类,该类负责与MySQL数据库建立连接并管理数据库操作。在类中,我们将实现一个静态成员函数`getInstance()`,它返回单例对象的引用。同时,...

    php使用单例模式实现mysql类

    一个php使用单例模式实现mysql类,封装mysql操作类,包括连接功能,及查询功能,封装getAll,getRow,getOne,afftect_rows()方法。

    单例模式实现mdi界面子窗体控制

    首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述

    使用C++11实现线程安全的单例模式

    线程安全的单例模式实现可以基于静态局部变量和`std::call_once`。以下是一个简单的示例: ```cpp #include class Singleton { private: Singleton() {} // 私有构造函数 static std::once_flag init_flag; ...

    使用Java单例模式实现一个简单的登录验证系统.txt

    ### 使用Java单例模式实现一个简单的登录验证系统 #### 登录验证系统概述 本文档将详细介绍如何使用Java语言结合单例设计模式实现一个简单的登录验证系统。登录验证系统是现代软件应用中的基本功能之一,它负责...

    c++单例模式线程日志类

    在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、精确的时间戳以及可变长参数和标准格式化输出的功能。 首先,让我们深入了解单例模式。单例模式的主要...

    Python 115.设计模式_单例模式实现.mp4

    Python 115.设计模式_单例模式实现.mp4

    单例模式PHP实现代码类.zip

    - PHP单例模式实现的核心是控制构造函数的访问权限,使其私有(private),防止外部直接实例化。 - 定义一个私有的静态成员变量`$_instance`来存储类的实例。 - 提供一个公共的静态方法`getInstance()`,在第一次...

    java单例模式连接数据库源码

    首先,我们需要了解Java中的单例模式实现方式。常见的有懒汉式、饿汉式、双重检查锁定(DCL)以及静态内部类四种。其中,DCL和静态内部类是最推荐的,因为它们既实现了线程安全,又保证了单例的唯一性,并且延迟加载...

    7种单例模式

    下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...

    单例模式单例模式单例模式

    在给定的内容中提到的`Martin`类就是一个典型的单例模式实现案例。它通过将构造器私有化以及提供一个静态成员变量来确保了`Martin`类的唯一实例的存在。 ```java public class Martin { private Martin() { // ...

    单例模式应用场景

    文件系统本质上是一个大型的单例模式实现,确保了所有文件操作都在同一套规则下执行,从而保障了数据的完整性和安全性。 **9. HttpApplication** 在ASP.NET框架中,HttpApplication作为HTTP请求处理流程的核心组件...

    php单例模式实现方法分析

    在给定的文件内容中,PHP单例模式实现方法分析的示例代码如下: ```php class Single { private $name; private static $single; private function __construct() { } public static function init() { if...

    单例模式各种实现及分享

    java单例模式的多种实现方法及优劣区分,以及如何摧毁单例模式。能够让大家认识到单例的多种多样

Global site tag (gtag.js) - Google Analytics