`

线程安全的单例模式(线程安全)示例

阅读更多

可以说单例模式是所有设计模式中最简单的一种。

单例模式就是说系统中对于某类的只能有一个对象,不可能出来第二个。

单例模式也是23中设计模式中在面试时少数几个会要求写代码的模式之一。主要考察的是多线程下面单例模式的线程安全性问题

1.多线程安全单例模式实例一(不使用同步锁)

public class Singleton {
    private static Singleton sin=new Singleton();    ///直接初始化一个实例对象
    private Singleton(){    ///private类型的构造函数,保证其他类对象不能直接new一个该对象的实例
    }
    public static Singleton getSin(){    ///该类唯一的一个public方法    
        return sin;
    }
}

 上述代码中的一个缺点是该类加载的时候就会直接new 一个静态对象出来,当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载”,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。 

2.多线程安全单例模式实例二(使用同步方法)

public class Singleton {  
     private static Singleton instance;  
     private Singleton (){
         
     }   
     public static synchronized Singleton getInstance(){    //对获取实例的方法进行同步
       if (instance == null)     
         instance = new Singleton(); 
       return instance;
     }
 }

 上述代码中的一次锁住了一个方法, 这个粒度有点大 ,改进就是只锁住其中的new语句就OK。就是所谓的“双重锁”机制。

3.多线程安全单例模式实例三(使用双重同步锁)

public class Singleton {  
     private static Singleton instance;  
     private Singleton (){
     }   
     public static Singleton getInstance(){    //对获取实例的方法进行同步
       if (instance == null){
           synchronized(Singleton.class){
               if (instance == null)
                   instance = new Singleton(); 
           }
       }
       return instance;
     }
     
 }
分享到:
评论

相关推荐

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

    线程安全的单例模式在多线程环境下尤其重要,因为不正确的实现可能导致多个线程创建多个实例,这违反了单例模式的基本原则。C++11引入了新的特性,如std::mutex和std::call_once,使得实现线程安全的单例模式变得...

    线程安全单例

    给定的代码示例采用了一种称为“懒汉式”的单例模式实现方式,同时利用了静态内部类来保证线程安全性。这种方式也被称作“静态内部类法”或“初始化保证法”。下面将详细介绍其实现原理及其优势。 #### 静态内部类...

    详解C++实现线程安全的单例模式

    为了使懒汉模式在多线程环境中成为线程安全的单例,我们可以引入互斥锁(`pthread_mutex_t`)。在C++中,通常使用`std::mutex`,但在示例中使用了POSIX线程库`pthread`。当多个线程尝试访问`GetInstance()`时,只有...

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

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

    线程相关的单例模式

    在软件开发中,单例模式是一种常用的面向对象...在压缩包文件"test"中,可能包含了实现这些线程相关单例模式的代码示例,通过阅读和分析这些代码,我们可以深入理解各种单例模式的实现细节及其在多线程环境下的行为。

    Qt多工程调用单例实现,带线程锁

    总结来说,这个资源提供了在Qt环境中实现跨工程单例模式的示例,利用线程锁确保数据管理的线程安全。这对于大型项目和需要共享数据的多模块应用尤其重要。通过学习这个案例,开发者可以掌握如何在Qt中正确设计和使用...

    设计模式之单例模式(结合工厂模式)

    在项目中,`src`目录可能包含了这些设计模式的源码示例,可以用来学习和理解如何实际应用单例模式和工厂模式。通过阅读和分析这些代码,你可以更深入地理解这两种模式的实现细节及其在实际开发中的作用。同时,也...

    Java多线程-解决单例模式中的懒汉式的线程安全问题

    ### Java多线程—解决单例模式中的懒汉式的线程安全问题 #### 一、单例设计模式的线程安全问题 ##### (1)饿汉式没有线程安全问题 **饿汉式**是一种非常典型的单例模式实现方式,其特点是在类加载时就完成了实例...

    单例模式示例

    除了这两种基本的实现方式,还有其他变种,比如静态内部类单例模式,它结合了懒汉模式的延迟初始化和饿汉模式的线程安全性: ```java public class Singleton { private Singleton() {} private static class ...

    使用单例模式创建学生管理系统(饿汉式、懒汉式)

    但是,如果不进行同步控制,懒汉式在多线程环境下可能会创建多个实例,因此通常采用双重检查锁定(Double-Checked Locking,DCL)来实现线程安全的懒汉式单例: ```java public class Singleton { private ...

    单例模式(用winform写的)

    通过分析这个示例代码,我们可以学习如何将单例模式融入到实际项目中,了解如何创建和使用单例类,以及如何在Winform的环境中处理多线程问题。 单例模式的优点包括: 1. 节省内存:避免了多次实例化同一对象。 2. ...

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

    总的来说,单例模式是一种常见的设计模式,懒汉式单例模式则是其中一种实现策略,它的主要特点是延迟加载和线程安全。在选择单例模式实现时,开发者需要根据具体需求考虑性能、线程安全以及代码简洁性等因素。

    老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)

    在C++编程中,单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于管理共享资源,如数据库...同时,确保正确处理线程安全问题对于单例模式至关重要,特别是在多线程环境中。

    Qt两种方法实现多线程并安全结束线程及QMutex加锁Qt单例化实现

    本主题将详细探讨如何使用Qt的QThread类来创建和管理线程,并且安全地结束线程,同时结合QMutex进行线程同步,以及如何实现Qt的单例模式。 1. **QThread的使用**: - **创建线程**: 在Qt中,创建线程通常是通过...

    单例模式(饿汉模式、懒汉模式、DCL单例模式、枚举)

    单例模式是设计模式中的一种,它在...DCL单例模式在性能和线程安全之间找到了平衡;而枚举单例模式则是最安全且推荐的实现方式,适用于大多数情况。在实际开发中,开发者应根据项目特点和性能需求选择合适的单例模式。

    C++单例模式示例代码

    下面是一个简单的C++单例模式实现示例: ```cpp class Singleton { private: Singleton() {} // 私有构造函数 static Singleton* instance; // 静态成员变量 public: static Singleton* getInstance() { // ...

    单例模式,single

    1. **线程安全的单例模式**:可以通过加锁或者使用内部类等方式来保证线程安全。例如,懒汉式单例模式中,可以在 `getInstance()` 方法上添加 `synchronized` 关键字,或者采用双重检查锁定(Double Checked Locking)...

    C++线程安全的单例模式

    线程安全的单例模式是当多个线程并发访问时,能够正确处理并保证只有一个实例被创建。以下是两种常见的线程安全单例模式实现方式: 1. **懒汉模式**(Lazy Initialization): 懒汉模式的特点是在第一次调用`...

    OC单例模式讲解

    在多线程环境下,如果不采取适当的措施,单例模式可能会出现线程安全问题。例如,在非线程安全的单例实现中,多个线程可能同时进入判断条件,导致创建多个实例。为了解决这个问题,可以采用以下几种方法: 1. **...

    c#单例模式示例

    在C#中,单例模式可以通过多种方式实现,如Eager Initialization(急切初始化)、Lazy Initialization(懒惰初始化)以及线程安全的懒惰加载等。本文将重点介绍C#中两种不同的单例模式实现方法:基于嵌套类的完全...

Global site tag (gtag.js) - Google Analytics