`
qq4628241
  • 浏览: 61442 次
  • 性别: 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虚拟机实现会产生的上述问题。
分享到:
评论

相关推荐

    Java并发编程原理与实战

    JDK5提供的原子类的操作以及实现原理.mp4 Lock接口认识与使用.mp4 手动实现一个可重入锁.mp4 AbstractQueuedSynchronizer(AQS)详解.mp4 使用AQS重写自己的锁.mp4 重入锁原理与演示.mp4 读写锁认识与原理.mp4 细读...

    java面试800题

    factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、decorator装饰模式、bridge桥梁模式、...

    java进阶13天资料.zip

    Java进阶13天资料 day01-复习回顾、静态、继承、引用类型使用 day02-抽象类、接口、代码块,final、单例、枚举 day03-多态、包、权限修饰符、内部类,Object类,Date类 day04-常用API、正则表达式,泛型、Collection...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    5并行模式与算法 5.1探讨单例模式 5.3生产者-消费者模式 5.5future模式 5.2不变模式 5.4高性能的生产者-消费者模式:无锁的实现 5.6并行流水线 01 02 03 04 05 06 实战Java高并发程序设计(第2版)PPT模板全文共25...

    龙果java并发编程完整视频

    第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...

    龙果 java并发编程原理实战

    第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...

    质数金融笔试题1

    二、代码编写1、用任意程序语言(可以用伪代码)写一个线程安全的单例模式,要求性能尽可能优化*(假设该单例每秒要调用上万次)2、对一个数据集合给定如下原子操作:d

    java面试题

    Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作典型...

    Java 并发编程原理与实战视频

    第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...

    java并发编程

    第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...

    常见的Java笔试题-JVM-JUC-Core:JUCJVM核心知识点

    单例模式的安全问题 CAS CAS底层原理 CAS缺点 ABA问题 AtomicReference AtomicStampedReference和ABA问题的解决 集合类不安全问题 List CopyOnWriteArrayList Set HashSet和HashMap Map Java锁 公平锁/非公平锁 可重...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    java8集合源码分析-The-Road-To-Bald-Man:Java技能加点,秃顶之路

    java8 集合源码分析 [TOC] The Road To Bald Man! 整理: 版本:V1.0 一、Java基础 基础语法 面向对象 接口 容器 异常 泛型 反射 注解 I/O NIO 多线程和并发 并发编程基础 线程池 锁 并发容器 原子类 JUC并发工具类 ...

    leetcode下载-Note:我的笔记

    设计模式(六大基本原则、项目中常用的设计模式、手写单例等) 断点续传 volatile理解,JMM中主存和工作内存到底是啥?和JVM各个部分怎么个对应关系? 序列化,Serializable在序列化时使用了反射,从而导致GC的频繁...

Global site tag (gtag.js) - Google Analytics