`

线程安全的单例类

阅读更多
    单例模式中,有两种实现,一种是饥饿模式,另一种是懒汉模式。
    饥饿模式的实现:
public final class EagerSingleton  {  
    private static EagerSingleton instance = new EagerSingleton();        
    
    private EagerSingleton(){  
    }  
	  
    public static EagerSingleton getSingleInstance(){  
        return instance;
    }  
}  

    优点:线程安全
    缺点:未使用该对象的时候,已经加载到了内存,但对象很大的时候是一种浪费

    懒汉模式的基本实现:
public final class LazySingleton {  
    private static LazySingleton instance = null;  
	  
    private LazySingleton(){  
    }  
	  
    public static LazySingleton getSingleInstance(){  
        if(null == instance ) {
	    instance = new LazySingleton();
	}
	eturn instance;
    }  
}  

    优点:延迟加载,按需分配内存
    缺点:线程不安全,如果两个线程同时第一次访问getInstance方法,则会生成两份实例。
   
    为了解决懒汉模式的线程安全问题,第一种解决方法是在getInstance方法前加入synchronized修饰。
public final class LazySingleton {  
    private static LazySingleton instance = null;  
	  
    private LazySingleton(){  
    }  
	  
    public static synchronized LazySingleton getSingleInstance(){  
        if(null == instance ) {
	    instance = new LazySingleton();
	}
	eturn instance;
    }  
}  

   
    第一种方法可以解决线程安全问题,但使用synchronized同步必将降低性能,所以可以考虑将同步的粒度降低,所以有了第二种解决方法。
public final class DoubleCheckedSingleton {  
    private static DoubleCheckedSingleton instance = null;  
	  
    private DoubleCheckedSingleton(){  
    }  
	  
    public static DoubleCheckedSingleton getSingleInstance(){  
        if(instance == null ) {
            Synchronized(DoubleCheckedSingleton.class){
                if(instance == null){
	            instance = new DoubleCheckedSingleton();
                }
	    }
	}
	return instance;
    }  
}  

    第二种解决方法,实现了线程安全,同时也将同步的粒度降低到代码块中,提高了性能。但第二种解决方法是用双重检查锁来实现,这种做法是不推荐使用的。
    那么就有了第三种解决方法,使用内部类来延迟加载,在类的加载过程中会保证线程的安全。
public class Singleton {    
    private static class SingletonHolder {    
        public final static Singleton instance = new Singleton();    
    }    
	   
    public static Singleton getInstance() {    
        return SingletonHolder.instance;    
    }    
}  
分享到:
评论

相关推荐

    Qt线程安全单例模式写日志模式

    保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例,具有线程安全,多线程测试通过。 1.打开日志并创建日志文件夹 默认为程序启动路径 2.清理日志文件下日志数量 默认保留90...

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

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

    线程安全单例

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

    线程安全的单例模式

    ### 线程安全的单例模式详解 #### 一、单例模式简介 单例模式(Singleton Pattern)是软件开发中最常用的创建型设计模式之一,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。单例模式在很多场景下...

    C++两种线程安全的单例模式的实现

    使用"懒汉模式"与"饿汉模式"实现c++的单例模式,并且确保了单例模式的第一次实例化的线程安全,以及程序结束时,单例对象的资源收回,以防内存资源的泄漏

    ios-FMDBsharedInstance 多线程FMDB单例类.zip

    当我们谈论“ios-FMDBsharedInstance 多线程FMDB单例类”时,我们关注的是如何在多线程环境中高效、安全地使用FMDB的单例模式。 首先,让我们了解FMDB的基本概念。FMDB是Facebook开源的一个Objective-C SQLite库,...

    Java中懒汉单例设计模式线程安全测试

    Java中懒汉单例设计模式线程安全测试,单例设计模式的测试

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

    然而,如果我们想要在类级别实现线程安全的单例模式,就需要考虑多线程环境下的并发问题。 在给出的代码中,首先定义了一个装饰器`Singleton`,它的目的是确保每次调用时返回的是同一个实例。装饰器内部维护了一个...

    浅议单例模式之线程安全(转)

    以上就是单例模式在Java中的常见实现方式,其中线程安全的实现包括饿汉式、静态代码块、双重检查锁定、静态内部类以及枚举方式。在实际应用中,应根据项目需求选择适合的单例实现方式,考虑到性能和线程安全等因素。...

    c++单例日志类(c++11,线程安全)

    c++单例日志类,c++11跨平台,线程安全,自己一直在用在改善。有好的指导,可以留言学习交流。

    c++线程安全单例模式

    c++单例模式, 需要boost中的function、bind、shared_ptr支持; 很好用; 下载中含简单的测试代码; 原帖:http://blog.csdn.net/CDScan/archive/2009/11/21/4848084.aspx

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

    在本文中,我们将深入探讨如何在Qt环境中使用多工程调用单例模式,并结合线程锁来确保数据管理的一致性和安全性。首先,我们要理解单例设计模式是一种创建型设计模式,它保证一个类只有一个实例,并提供全局访问点。...

    多线程单例模式并发访问

    ### 多线程单例模式并发访问 #### 一、多线程基础概念 在讨论多线程单例模式及并发访问之前,我们先来了解一些基本概念。 **进程**和**线程**是计算机科学中的两个核心概念,它们之间的关系紧密而复杂。 - **进程...

    Java单例类

    单例模式可以帮助我们解决很多实际问题,例如资源共享、线程安全、性能优化等问题。 总结 单例模式是一种常见的设计模式,具有三个特点:单例类只能有一个实例、单例类必须自己创建自己的唯一实例、单例类必须给...

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

    饿汉模式在类加载时完成实例化,是线程安全的,而懒汉模式需要额外的同步机制如互斥锁来保证线程安全。双重检查锁定是一种优化策略,可以减少不必要的锁操作。在C++11及更高版本中,可以利用`std::call_once`等特性...

    Java 单例模式线程安全问题

    ThreadLocal 类可以解决单例模式的线程安全问题。ThreadLocal 提供了一个独立的变量副本,为每一个线程提供了一个独立的实例副本,从而实现了实例访问的隔离。这样,在多线程环境下,每个线程都可以安全地访问实例...

    单例模式线程安全的三种表达

    单例模式三种线程安全的表达方式,其中枚举方式的单例是最安全的

    java多线程之线程安全的单例模式

    总结来说,Java中的线程安全单例模式有多种实现方式,如饿汉式、懒汉式、双重检查锁定和静态内部类单例。每种实现都有其优缺点,开发者应根据实际需求和性能考虑来选择合适的实现方式。在多线程环境中,确保单例模式...

    synchronized与单例的线程安全

    "synchronized"关键字和单例模式是确保线程安全的两种常见手段。本文将详细探讨这两个概念及其在实现线程安全中的作用。 一、synchronized关键字 synchronized是Java中的一个关键同步机制,用于控制对类或对象的...

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

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

Global site tag (gtag.js) - Google Analytics