问题
不同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虚拟机实现会产生的上述问题。
分享到:
相关推荐
JDK5提供的原子类的操作以及实现原理.mp4 Lock接口认识与使用.mp4 手动实现一个可重入锁.mp4 AbstractQueuedSynchronizer(AQS)详解.mp4 使用AQS重写自己的锁.mp4 重入锁原理与演示.mp4 读写锁认识与原理.mp4 细读...
factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、decorator装饰模式、bridge桥梁模式、...
Java进阶13天资料 day01-复习回顾、静态、继承、引用类型使用 day02-抽象类、接口、代码块,final、单例、枚举 day03-多态、包、权限修饰符、内部类,Object类,Date类 day04-常用API、正则表达式,泛型、Collection...
5并行模式与算法 5.1探讨单例模式 5.3生产者-消费者模式 5.5future模式 5.2不变模式 5.4高性能的生产者-消费者模式:无锁的实现 5.6并行流水线 01 02 03 04 05 06 实战Java高并发程序设计(第2版)PPT模板全文共25...
第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...
第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...
二、代码编写1、用任意程序语言(可以用伪代码)写一个线程安全的单例模式,要求性能尽可能优化*(假设该单例每秒要调用上万次)2、对一个数据集合给定如下原子操作:d
Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...
本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作典型...
第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...
第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...
单例模式的安全问题 CAS CAS底层原理 CAS缺点 ABA问题 AtomicReference AtomicStampedReference和ABA问题的解决 集合类不安全问题 List CopyOnWriteArrayList Set HashSet和HashMap Map Java锁 公平锁/非公平锁 可重...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
java8 集合源码分析 [TOC] The Road To Bald Man! 整理: 版本:V1.0 一、Java基础 基础语法 面向对象 接口 容器 异常 泛型 反射 注解 I/O NIO 多线程和并发 并发编程基础 线程池 锁 并发容器 原子类 JUC并发工具类 ...
设计模式(六大基本原则、项目中常用的设计模式、手写单例等) 断点续传 volatile理解,JMM中主存和工作内存到底是啥?和JVM各个部分怎么个对应关系? 序列化,Serializable在序列化时使用了反射,从而导致GC的频繁...