问题
不同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虚拟机实现会产生的上述问题。
分享到:
相关推荐
这种方法要求缓存系统支持原子操作,以保证只有一个节点能够成功写入单例对象。 4. **命名空间**:在某些编程语言中,如Java,可以利用`java.lang.Runtime`或`InetAddress`等来获取当前服务器的唯一标识,然后将这...
java 单例模式的实例详解 java 单例模式是指一种设计模式,确保某个类只有一个实例,而且自行实例化并向整个系统提供...我们可以使用不同的方法来实现单例模式,但需要考虑线程安全问题,以确保程序的正确性和可靠性。
单例模式是 Java 中一种常见的设计模式,分为懒汉式单例、饿汉式单例和登记式单例三种。单例模式有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供...
在Java编程中,实现单例模式有多种方式,每种方式都有其优缺点。 1. **饿汉式**: 饿汉式在类加载时即创建单例,因此是线程安全的,初始化速度快,内存占用小。但缺点是无论是否需要,单例都会在类加载时被创建,...
此外,Java 5引入的`Enum`单例模式也被认为是一种安全且简洁的实现方式: ```java public enum Singleton { INSTANCE; } ``` 这种方式避免了同步问题,同时由于枚举常量在类加载时就初始化,因此也保证了单例的...
总结来说,本文档通过介绍单例模式在多核多线程环境下的性能提升方法,探讨了Java设计模式在现代大型系统应用中的优化策略,并对JDK未来的设计模式实现提出期望,为Java开发人员提供了宝贵的技术指导和参考。
7. 原子操作模式:使用`java.util.concurrent.atomic`包中的原子类,如`AtomicInteger`、`AtomicLong`等,实现非阻塞的原子操作,提升多线程环境下的性能。 8. 轻量级锁定模式:Java 5引入了`java.util.concurrent....
例如,数据库连接池通常采用单例模式实现,以减少资源开销。 8. **单元测试**:为了确保代码的正确性,开发者可能使用JUnit或其他测试框架进行了单元测试,对每个功能模块进行独立验证。 综上所述,这个银行系统...
在Java编程中,生成订单号...对于提供的`java订单号(时间加流水号).txt`文件,可能包含了具体的代码实现或使用示例,你可以查阅该文件以获取更详细的实现细节。在实际开发中,务必根据业务需求进行适当的调整和优化。
8. **延迟初始化与单例模式**:书中探讨了在并发环境下的延迟初始化和单例模式实现,比如双检锁(DCL)和静态内部类等实现方式。 9. **并发性能分析**:并发程序的性能分析和调优是另一个重要主题。书中提供了工具和...
5. 原子操作模式:使用java.util.concurrent.atomic包中的原子类,如AtomicInteger,提供无锁的并发操作。 四、同步机制 1. synchronized关键字:用于实现线程互斥,保证同一时刻只有一个线程访问共享资源。 2. ...
以上只是Java中部分设计模式的简介,实际编程中,开发者需要根据具体需求选择合适的设计模式,灵活运用,以实现高效、可扩展的软件系统。设计模式的学习和掌握是每个Java程序员进阶道路上不可或缺的一部分。
2. 单例模式:数据库连接管理通常采用单例模式,确保全局只有一个数据库连接实例,减少资源消耗。 六、测试与部署 1. 单元测试:对系统中的各个模块进行单元测试,确保每个功能都能正常运行。 2. 集成测试:在所有...
3. **原子操作类(java.util.concurrent.atomic)**:提供了一组原子操作的类,如AtomicInteger、AtomicLong等,它们能保证在多线程环境下的原子性操作。 **线程同步**: 线程同步是为了避免多个线程同时访问共享...
常见的线程安全单例模式有双重检查锁定(DCL)、静态内部类和枚举方式。 8. 线程通信:wait()、notify()和notifyAll()是Java Object类提供的方法,用于线程间的通信,配合synchronized使用,可以使线程在特定条件下...
为了提高单例模式的线程安全性和性能,可以采用**静态内部类**的方式实现单例模式,这种方式结合了饿汉式和懒汉式的特点,既实现了懒加载,又避免了同步带来的性能开销。 ```java public class Singleton { // ...
3. **单例模式**:确保一个类只有一个实例,并提供全局访问点,需考虑线程安全的单例实现。 4. **线程池**:预先创建一组线程,根据任务需求分配,提高系统效率。 五、java.util.concurrent包 这个包提供了高级并发...
8. 原子操作模式:使用java.util.concurrent.atomic包中的原子类,如AtomicInteger,提供一种无锁编程的方式,保证操作的原子性。 9. 软中断和中断检查模式:通过Thread.interrupt()和Thread.isInterrupted()检查并...