`
qq4628241
  • 浏览: 62597 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java单例模式 以原子操作方式的实现

 
阅读更多
问题
不同Java虚拟机实现产生有引用未构造问题
Java虚拟机初始化对象时,分析如下
SomeObject so = new SomeObject();
Java虚拟机JVM
指令       
so   ====> memory             A步骤
.
.    =====> construct--执行构造 B步骤
.
.    =====> asign -----指定其他的引用,或者实例化so中的其他变量 C步骤
.                  .
.                  .                                          其他步骤
.                  .
当一个线程执行到 步骤A 时,另一个线程访问 so对象
如  SomeObject  getSo()
此时  getSo() 返回 so对象的引用不为空
我们拿着一个so对象引用去获取so对象中的另一个属性,比如so.getOtherAttribute()
这个时候这个OtherAttribute在构造器中或其他步骤中,并没有执行完成,这将
会导致一个运行时异常。
我用一个单例模式的实现来说明此类问题的解决方法
package test;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

public class AtomicSingleton {
	
	private static AtomicReference<AtomicSingleton> atomicReference = new AtomicReference<AtomicSingleton>();
	
	//test how constructor get into by new AtomicSingleton statement
	private AtomicInteger atomicInteger = new AtomicInteger(0);
	
	private AtomicSingleton(){
		int i = atomicInteger.get();
		atomicInteger.addAndGet(i++);
	}
	
	public static AtomicSingleton getInstance(){
		AtomicSingleton atomicSingleton = atomicReference.get();
		if(null == atomicSingleton){
			synchronized (AtomicSingleton.class) {
				//double checking the AtomicSingleton whether initial, ensure not new AtomicSingleton twice 
				//to waste the system resource
				if(null!=(atomicSingleton=atomicReference.get())){
					return atomicSingleton;
				}
				
				//ensure the locate the memory, construct and other instructs is atomic, 
				//whatever the implementation of the JVM 
				atomicReference.getAndSet(new AtomicSingleton());
				//atomicReference.compareAndSet(null, new AtomicSingleton());
				atomicSingleton = atomicReference.get();
			}
		}
		return atomicSingleton;
	}
	
}


对于多线程编程时,我们可以考虑使用java.util.concurrent.atomic.*包下的一系列
确保原子操作对象来实现原子操作,以排除不同Java虚拟机实现会产生的上述问题。
分享到:
评论

相关推荐

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    这种方法要求缓存系统支持原子操作,以保证只有一个节点能够成功写入单例对象。 4. **命名空间**:在某些编程语言中,如Java,可以利用`java.lang.Runtime`或`InetAddress`等来获取当前服务器的唯一标识,然后将这...

    java 单例模式的实例详解

    java 单例模式的实例详解 java 单例模式是指一种设计模式,确保某个类只有一个实例,而且自行实例化并向整个系统提供...我们可以使用不同的方法来实现单例模式,但需要考虑线程安全问题,以确保程序的正确性和可靠性。

    单例模式讲解说明与实例

    单例模式是 Java 中一种常见的设计模式,分为懒汉式单例、饿汉式单例和登记式单例三种。单例模式有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供...

    常见设计模式-单例模式

    在Java编程中,实现单例模式有多种方式,每种方式都有其优缺点。 1. **饿汉式**: 饿汉式在类加载时即创建单例,因此是线程安全的,初始化速度快,内存占用小。但缺点是无论是否需要,单例都会在类加载时被创建,...

    击穿单例模式的Demo示范代码

    此外,Java 5引入的`Enum`单例模式也被认为是一种安全且简洁的实现方式: ```java public enum Singleton { INSTANCE; } ``` 这种方式避免了同步问题,同时由于枚举常量在类加载时就初始化,因此也保证了单例的...

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

    总结来说,本文档通过介绍单例模式在多核多线程环境下的性能提升方法,探讨了Java设计模式在现代大型系统应用中的优化策略,并对JDK未来的设计模式实现提出期望,为Java开发人员提供了宝贵的技术指导和参考。

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

    7. 原子操作模式:使用`java.util.concurrent.atomic`包中的原子类,如`AtomicInteger`、`AtomicLong`等,实现非阻塞的原子操作,提升多线程环境下的性能。 8. 轻量级锁定模式:Java 5引入了`java.util.concurrent....

    Java实现简单的数据库以及银行系统实现

    例如,数据库连接池通常采用单例模式实现,以减少资源开销。 8. **单元测试**:为了确保代码的正确性,开发者可能使用JUnit或其他测试框架进行了单元测试,对每个功能模块进行独立验证。 综上所述,这个银行系统...

    JAVA生成订单号(日期+流水号)

    在Java编程中,生成订单号...对于提供的`java订单号(时间加流水号).txt`文件,可能包含了具体的代码实现或使用示例,你可以查阅该文件以获取更详细的实现细节。在实际开发中,务必根据业务需求进行适当的调整和优化。

    Java并发编程设计原则与模式.pdf

    8. **延迟初始化与单例模式**:书中探讨了在并发环境下的延迟初始化和单例模式实现,比如双检锁(DCL)和静态内部类等实现方式。 9. **并发性能分析**:并发程序的性能分析和调优是另一个重要主题。书中提供了工具和...

    Java并发编程设计原则和模式

    5. 原子操作模式:使用java.util.concurrent.atomic包中的原子类,如AtomicInteger,提供无锁的并发操作。 四、同步机制 1. synchronized关键字:用于实现线程互斥,保证同一时刻只有一个线程访问共享资源。 2. ...

    设计模式_Java语言中的应用

    以上只是Java中部分设计模式的简介,实际编程中,开发者需要根据具体需求选择合适的设计模式,灵活运用,以实现高效、可扩展的软件系统。设计模式的学习和掌握是每个Java程序员进阶道路上不可或缺的一部分。

    java版的图书管理系统主要实现添加书 借阅 还书等功能

    2. 单例模式:数据库连接管理通常采用单例模式,确保全局只有一个数据库连接实例,减少资源消耗。 六、测试与部署 1. 单元测试:对系统中的各个模块进行单元测试,确保每个功能都能正常运行。 2. 集成测试:在所有...

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义

    3. **原子操作类(java.util.concurrent.atomic)**:提供了一组原子操作的类,如AtomicInteger、AtomicLong等,它们能保证在多线程环境下的原子性操作。 **线程同步**: 线程同步是为了避免多个线程同时访问共享...

    java多线程设计模式

    常见的线程安全单例模式有双重检查锁定(DCL)、静态内部类和枚举方式。 8. 线程通信:wait()、notify()和notifyAll()是Java Object类提供的方法,用于线程间的通信,配合synchronized使用,可以使线程在特定条件下...

    谈面试时从写一个单例开始究竟能问多深及终极解决方案.docx

    为了提高单例模式的线程安全性和性能,可以采用**静态内部类**的方式实现单例模式,这种方式结合了饿汉式和懒汉式的特点,既实现了懒加载,又避免了同步带来的性能开销。 ```java public class Singleton { // ...

    Java并发编程_设计原则和模式(CHM)

    3. **单例模式**:确保一个类只有一个实例,并提供全局访问点,需考虑线程安全的单例实现。 4. **线程池**:预先创建一组线程,根据任务需求分配,提高系统效率。 五、java.util.concurrent包 这个包提供了高级并发...

    Java多线程设计模式

    8. 原子操作模式:使用java.util.concurrent.atomic包中的原子类,如AtomicInteger,提供一种无锁编程的方式,保证操作的原子性。 9. 软中断和中断检查模式:通过Thread.interrupt()和Thread.isInterrupted()检查并...

Global site tag (gtag.js) - Google Analytics