`
easy0917
  • 浏览: 261103 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

双重检查加锁

 
阅读更多
双重检查加锁机制
并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块。

双重检查加锁机制的时间会使用一个关键字volatile,他的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。

public class Singleton {
	private volatile static Singleton instance= null;
	private Singleton(){}
	public Singleton getInstance(){
		if(instance==null){
			synchronized (Singleton.class) {
				if(instance==null){
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}
分享到:
评论
1 楼 xieyaxiong 2012-05-16  
getInstance 应该是静态方法呵 哥们

相关推荐

    Java双重检查加锁单例模式的详解

    "Java双重检查加锁单例模式的详解" Java双重检查加锁单例模式是一种常用的单例模式实现方法,但是在多线程环境下,它存在一些问题。在这篇文章中,我们将探讨Java双重检查加锁单例模式的详解,包括它的优点和缺点,...

    面试官的一道简单的单例模式问题给我问懵了,详解单例模式双重检查加锁为什么要加volatile关键字!

    面试中提到的“双重检查加锁”(Double-Check Locking)是一种优化的懒汉式单例实现方式,旨在兼顾线程安全与性能。 在Java中,未使用`volatile`关键字的双重检查加锁可能会遇到问题,这是因为Java内存模型(JMM)...

    QT单例模式、多线程、双重校验加锁

    在QT中,单例模式、多线程以及双重校验加锁(Double-Checked Locking)是常见的编程模式和技术,尤其在处理并发和资源管理时显得尤为重要。 **单例模式** 是一种设计模式,确保一个类只有一个实例,并提供一个全局...

    项目中用到的jdbc连接 单例模式

    * 双重检查加锁方法,由于JVM内部的问题,该方法还是有漏洞的。 * 假设线程1进入到步骤2,执行步骤3未完成,会先将instance设为非null值。 * 这时候线程2会在判断instance==null的时候失败,返回一个不完整的...

    饿汉模式在云计算中的应用.pptx

    - **线程安全性**: 双重检查加锁模式通过同步代码块和`volatile`变量保证线程安全;饿汉模式在类加载时创建单例对象,线程安全更为简单直接。 - **性能**: 饿汉模式在类加载时创建对象,性能略低;双重检查加锁模式...

    常见设计模式-单例模式

    为了解决这个问题,可以使用双重检查加锁机制,例如: ```java class Singleton4 { private static volatile Singleton4 singleton4; private Singleton4() {} public static Singleton4 getInstance() { if ...

    Java的单例设计模式详解

    在Java中,实现单例模式有多种方式,包括经典的懒汉式、饿汉式以及双重检查加锁等。下面将详细阐述这些实现方式及其优缺点。 1. **什么是单例模式** 单例模式是一种创建型设计模式,它保证一个类只有一个实例,并...

    Python单例模式的两种实现方法

    **方法一:双重检查加锁** 这种方法的关键在于“双重检查”和“线程安全”。首先,我们定义一个类`Singleton`,并初始化一个类级别的变量`__instance`来保存单例实例。为了确保线程安全,我们使用`threading.Lock()...

    Java并发编程实战

    Java并发编程实战 本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,...16.2.4 双重检查加锁286 16.3 初始化过程中的安全性287 附录A 并发性标注289

    JAVA多线程并发下的单例模式应用

    JAVA多线程并发下的单例模式应用 单例模式是设计模式中比较简单的一个,也是...在多线程并发下的单例模式应用中,我们需要考虑线程安全问题,可以使用synchronized关键字、双重检查加锁机制或枚举类型来实现单例模式。

    『手撕』单例模式

    3. 双重检查加锁版本(Double-Checked Locking) 这种方式解决了懒汉模式的线程安全性问题。在多线程环境中,只有在真正需要创建实例时,才会进行同步操作,提高了效率。双重检查确保了只有在实例不存在时,才会...

    深入分析Java单例模式的各种方案

    为了兼顾性能和线程安全,通常采用双重检查加锁(Double-Checked Locking)模式: ```java public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton ...

    电脑加锁王

    为了保持软件的最新安全更新,用户应定期检查软件的更新,确保其功能的稳定性和安全性。"PcLock1.5.2"可能是软件的一个版本号,用户在安装时应确认这是最新的版本,如果不是,应及时到官方网站查找并下载更新。 总...

    安卓手势解锁 两次手势加锁,解锁需验证

    在这个特定的“安卓手势解锁 两次手势加锁,解锁需验证”的实现中,安全性得到了进一步加强,增加了额外的验证机制。 首先,我们要理解手势解锁的基本原理。在安卓系统中,手势解锁通过触控屏记录用户的触摸轨迹,...

    单件模式下用的加锁(互斥)

    第一次检查是在不加锁的情况下进行的,以减少不必要的同步。只有当`uniqueObject`为`null`时,才会进入同步块进行第二次检查和实例化。 无论是`Mutex`还是双检锁,都是为了确保在多线程环境中,单件模式的实例化...

    C++ and the Perils of Double Checked Locking.zip

    《C++ and the Perils of Double Checked Locking》是一篇探讨C++编程中双重检查锁定(Double-Checked Locking)模式潜在问题的文献。在多线程编程中,双重检查锁定是一种常见的优化策略,旨在减少对同步原语的依赖...

    SingleInstance源码

    在`getInstance()`方法中,通常会使用双重检查锁定(Double-Check Locking)或饿汉式(Eager Initialization)策略来确保线程安全地创建单例。双重检查锁定示例如下: ```cpp // 双重检查锁定实现 static ...

    单例模式简介和java代码实现

    }}在双重检查锁(Double-Checked Locking)实现中,第一次检查是在不加锁的情况下进行的,只有当第一次检查后 instance 仍然为 null 时,才会进入同步代码块进行第二次检查和实例化。这种方式提高了并发性能,因为...

    java单例模式详解Java系列2021.pdf

    不过,使用双重检查锁定模式时要注意细节问题,如在多线程环境下,仅仅保证了实例变量的可见性还不够,还需要确保在实例化对象时,实例的初始化能够被正确完成,并且对其他线程可见。在Java中,由于JVM和编译器的...

    第三节 单例模式1

    在Go中,虽然不需要双重检查,但可以优化为"一次检查锁定",即在检查`instance`是否为`nil`后才加锁,如果`instance`已经不为空,那么就不需要加锁了。代码如下: ```go type singleton struct {} var instance *...

Global site tag (gtag.js) - Google Analytics