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

关于单例模式线程安全问题

阅读更多
很多地方都出现过这样的说法,单例模式要注意线程安全,就是要在取实例的操作上加入同步锁,比如
public xxx getInstance sync……(){
return instance;
}

首先,为什么要同步,不同步出现错误的时机是什么?
还有,单例模式有懒汉式和非懒汉式,如果是懒汉式是否需要加同步锁,非懒汉式呢,我个人对很多人说单例模式要注意线程安全有点迷惑,感觉大多数时候都没有必要。首先因为我很排斥同步锁,有时甚至宁可冒多线程出错的风险也不想加锁。这里抛砖引玉,看大家的想法。
分享到:
评论
2 楼 risemanjavaeye 2009-04-15  
其实对于懒汉式来说,应该可以不用注意多线程方面的问题的,这是我的一个意思,还有一个意思是,对于非懒汉式,我觉的,在有些方面(这种情况很多)我们用伪单例模式可能更合适,我这里的伪单例模式是在大多数情况下只有一个实例,但是在某些特殊的情况下,比如高度并发的情况下,我们应该允许他出现多个实例来满足实际的需要,当然,我们要保证业务逻辑不会出错,但没必要达到真正意义上的单例模式,单例模式的作用有一方面就是为了节省资源,提高速度,但为了绝对意义上的单例,我们去加个同步锁,感觉有点得不尝失。当然,前提是出现伪单例不会影响到业务逻辑。
1 楼 fmjasper 2009-04-14  
不同步的话, 对于懒汉式的, 就是在, 这个类的实例还没有创建的时候, 2个线程同时去调用getInstance, 这时, 由于没有同步锁, 有可能会创建出2个实例来。
对于饿汉式, 由于实例是在load class的时候创建的, 所以就没有这个问题。 当然, 就是2个线程采用了不同的class loader.
当然, 无论饿汉还是懒汉, 几率都不高, 但几率低不代表不会出错, 逻辑上也不对, 因此, 编程者还是应该避免。

相关推荐

    Java 单例模式线程安全问题

    Java 单例模式线程安全问题详解 Java 单例模式线程安全问题是指在 Java 中实现单例模式时,如何确保线程安全的问题。单例模式是指在整个应用程序生命周期中,只有一个实例存在的设计模式。这种模式可以提高性能,...

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

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

    线程安全的单例模式

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

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

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

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

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

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

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、...

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

    在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,违反了单例模式的基本原则。 在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): ...

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

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

    synchronized与单例的线程安全

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

    多线程单例模式并发访问

    总结起来,多线程环境下的单例模式实现需要注意线程安全问题,尤其是懒汉式单例,需要采取适当的同步措施来防止多线程环境下的实例化问题。此外,对于不同场景的需求,可以选择不同的实现方式来优化性能和资源使用。

    unity中涉及的三种单例模式

    下面将详细介绍在Unity中涉及的三种单例模式:C#经典单例、Unity内置单例以及一种线程安全的改进版单例。 1. C#经典单例: 这是最常见的单例实现方式,通常通过私有构造函数和一个静态方法来保证只有一个实例。在...

    7种单例模式

    为解决线程安全问题,可以将 `getInstance` 方法声明为同步的,但这会降低效率。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public synchronized static ...

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

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

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

    在实际应用中,我们可能会遇到线程安全问题。在Java中,为了确保多线程环境下的正确性,我们可以使用synchronized关键字来保证同步,但这会引入性能开销。DCL模式通过在实例化单例时使用 volatile 关键字和双层检查...

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

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

    java单例模式实例

    为了解决懒汉式的线程安全问题,我们引入**饿汉式(Eager Initialization)**。在类加载时就创建单例对象,因此是线程安全的,但可能导致不必要的内存占用。代码如下: ```java public class Singleton { private ...

    Java设计模式之单例模式的七种写法

    这种写法的问题是它没有考虑线程安全问题,在并发环境下很可能出现多个 Singleton1 实例。 2、懒汉式单例(加同步) public class Singleton2 { private Singleton2() {} private static Singleton2 single = ...

    设计模式——单例模式

    以上就是关于单例模式的一些核心概念和常见实现方式。在实际开发中,根据需求和场景选择合适的实现方式至关重要,以平衡性能和资源使用。同时,需要注意的是,过度依赖单例可能导致系统设计过于紧密,不利于测试和...

    使用单例模式实现计数器

    总结来说,单例模式在实现计数器时,可以确保计数器的全局唯一性,同时提供了一种线程安全的方式来管理和访问这个计数器。这种模式在需要全局共享资源或状态,如日志服务、缓存管理、数据库连接池等场景中尤为适用。...

    C#单例模式详解 C#单例模式详解C#单例模式详解

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一...

Global site tag (gtag.js) - Google Analytics