`

多线程情况下双重检查锁定问题的分析与优化

 
阅读更多
双重检查锁定(Double-Checked Locking)的由来
Java程序中,有时候需要推迟一些高开销对象的初始化操作,等到使用的时候才进行对象初始化。双重检查锁定是一种常见的延迟初始化技术。但是在多线程情况下,使用不当很容易出现问题。下面就来分析一下非线程安全的一段代码:
public class DoubleCheckedLocking {
	private static Instance instance;
 
	public static Instance getInstance() {
		if (instance == null) {					// line A 第一次检查
			synchronized (DoubleCheckedLocking.class) {	// line B 加锁
				if (instance == null) {			// line C 第二次检查
					instance = new Instance();	// line D 创建一个对象。 问题就出在这里!!!
				}
			}
		}
		return instance;
	}
}

从代码来看,如果第一次检查instance不为null,则不用继续执行加锁和初始化操作,可以降低synchronized带来的性能开销。但是如果在多线程情况下一个线程 执行第一次检查的时读取的instance不为null,然而此时instance引用的对象在另外一个线程中还没有初始化完成,这时程序就会出现错误。

参考:https://blog.csdn.net/u012739535/article/details/76039983
https://blog.csdn.net/qq_27489007/article/details/84966680
分享到:
评论

相关推荐

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **单例模式**:考虑多线程环境下的线程安全单例实现,如双重检查锁定。 - **读写锁**:`ReentrantReadWriteLock`提供读写分离的锁机制,提高并发效率。 6. **并发编程最佳实践** - **避免过度使用同步**:合理...

    多线程单例模式并发访问

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

    .NET多线程详解及源码

    - **双重检查锁定Singleton**:确保单例模式的安全初始化,但某些情况下可能存在线程竞争的问题。 - **比较锁语句**:`lock`、`Mutex`、`Event`各有适用场景,选择取决于同步需求的复杂性和粒度。 5. **Web和IIS*...

    Java多线程设计模式(带源码)

    Java中使用双重检查锁定(Double-Check Locking)或静态内部类方式实现线程安全的单例。 4. 状态模式:用于管理对象的状态,特别是在多线程环境下的状态转换。例如,`java.util.concurrent.atomic`包中的原子类,如...

    day24-多线程-设计模式.7z

    常见的实现方式有双重检查锁定、静态内部类等。 4. **死锁**:在多线程编程中,死锁是指两个或多个线程相互等待对方释放资源,导致无法继续执行的状态。为了解决死锁问题,我们可以遵循以下原则:避免持有多个锁、...

    JAVA多线程模式高清版+DEMO

    - 单例模式在多线程环境下的应用:确保类只有一个实例,通常使用双重检查锁定(DCL)。 在"Java多线程设计模式_清晰完整PDF版"文档中,你可能还会学习到如何结合实际场景选择合适的线程模型,如何优化多线程程序,...

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

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

    Java多线程之延迟初始化1

    在Java 5及更高版本中,这种问题已经通过改进的内存模型得到解决,双重检查锁定现在是线程安全且高效的延迟初始化实现方式。 总结来说,Java多线程环境下的延迟初始化需要考虑线程安全和性能优化。双重检查锁定通过...

    Java多线程编程实战指南 设计模式篇.rar

    2. 单例模式:在多线程环境下,确保类只有一个实例,通常采用双重检查锁定(DCL)或静态内部类等方式实现。 3. 状态模式:用于管理对象状态的变化,例如线程的状态(新建、运行、阻塞、死亡等),可以使用枚举类型来...

    java多线程设计模式

    - 在多线程环境中,单例模式需要确保线程安全,通常使用双重检查锁定(`Double-Checked Locking`)技术实现。 5. **屏障模式**: - 屏障模式使得一组线程在到达某个共同点后,等待所有线程都到达后再继续执行。 - ...

    Java多线程设计模式

    5. 双重检查锁定(Double-Checked Locking)模式:用于延迟初始化,确保线程安全的同时减少同步的开销。 6. 守护线程(Daemon Thread)模式:守护线程用于后台服务,当所有非守护线程结束时,守护线程也随之结束,...

    多核多线程下java设计模式性能提升.zip

    2. 单例模式:在多线程环境中,使用双重检查锁定(DCL)实现线程安全的单例,确保唯一实例的同时避免同步开销。 3. 生产者-消费者模式:通过BlockingQueue实现线程间的通信和协作,避免了直接线程间同步,提高了程序...

    java多线程设计模式(pdf)

    3. **设计模式**:本书的核心内容是多线程设计模式,包括生产者消费者模式、读写锁模式、单例模式(双重检查锁定)等。这些模式帮助开发者在处理并发问题时,避免常见的陷阱,提高代码的可读性和可维护性。 4. **...

    java多线程设计模式详解

    1. 双检锁(Double-checked Locking)模式:该模式通过双重检查锁定来减少锁的开销,同时确保只有一个实例被创建。 六、并发工具类 Java并发包(java.util.concurrent)中包含一些用于解决特定并发问题的工具类。 ...

    深入探讨Java多线程中的volatile变量共6页.pd

    在多线程环境下,为了提高执行效率,编译器或处理器可能会对指令进行重排序,但这种优化可能导致线程安全问题。volatile通过添加内存屏障来防止指令重排序,确保了对volatile变量的读写操作不会与其他指令交错,从而...

Global site tag (gtag.js) - Google Analytics