在Java并发编程实践(JAVA concurrency in practice)中的第十六章(Java存储模型)中.
有讲到对象安全发布.
其中就是以单例模式来说明这个安全初始化技巧的.这是学习分析总结如下:
引用
不正确发布带来的风险的真正原因是在"发布共享对象"与从"另一个线程访问它"之间,缺少happens-before排序.
不安全的发布.
发布(Publishing):
引用
发布(Publishing)一个对象的意思是使它能够被当前范围之处的代码所使用.比如将一个引用
存储到其他代码可以访问的地方.在一个非千私有的方法中返回这个引用,也可以把它传递到其他类的方法中.在很多情况下,我们需要确保对象及它们的内部状态不被暴露(publish).
代码清单1:不安全的惰性初始化:
public class UnsafeLazyInitialization{
private static Resource resource;
public static Resource getInstance(){
if(resource == null){
resource = new Resource();
}
return resource;
}
}
引用
除了不可变对象以外,使用被另一个线程初始化的对象,是不安全的,除非对象的发布是happens-before于对象的消费线程使用它.
安全初始化技巧:
代码清单2 线程安全的惰性初始化
public class SafeLazyInitialization{
private static Resource resource;
public synchronized static Resource getInstance(){
if(Resource == null){
resource = new Resource();
}
}
}
代码清单3 主动初始化
public class EagerInitialization{
private static Resource resource = new Resource();
public static Resource getResource() {
return resource;
}
}
像上面那样,使用主动的初始化,避免了每次调用SafeLazyInitialization的getInstance()的同步开销.这项技术可以和JVM的惰性类加载相结合,
创建一种惰性初始化技术,使得在通常的代码路径中都不需要同步.清单4的惰性初始化holder类技巧.使用一个专门用来初始化Resource的类.JVM将ResourceHolder的初始化被 延迟到真正使用它的时刻.因为Resource是在静态初始进行初始化的,所以不再需要额外的同步.,线程第一次调用getResource,引起ResourceHolder的加载和初始化,这个时候,正是静态初始阶段Resource完成初始化发生的时间.
清单4惰性初始化Holder类技巧
public class ResourceFactory{
private static ResourceHolder {
public static Resource resource = new Resource();
}
public static Resource getResource(){
return ResourceHolder.resource;
}
}
分享到:
相关推荐
Java中懒汉单例设计模式线程安全测试,单例设计模式的测试
主要介绍了Java线程安全中的单例模式,需要的朋友可以参考下
主要介绍了Java 单例模式线程安全问题的相关资料,希望通过本文大家能了解掌握单例模式中线程安全的使用方法,需要的朋友可以参考下
Java多线程--解决单例模式中的懒汉式的线程安全问题
Java 单例模式 懒汉模式 //懒汉式 多线程中不可以保证是一个对象
主要为大家详细介绍了java多线程之线程安全的单例模式,文章内容全面,感兴趣的小伙伴们可以参考一下
入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...
单例设计模式: 1、构造函数私有 2、定义类型为本身类型的成员 3、类中提供一个公共的并且静态的获取本类实例的方法
计算机后端-Java-Java核心基础-第20章 多线程 11. 线程安全的单例模式之懒汉式.avi
JVM监控实例数 windows监控 线程测试 单例模式下测试JVM实例是否一个
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
编写一个线程类AccessLimitInstanceClassThread,在其run()方法中获取一个LimitInstanceClass对象,调用获得的对象的writeAccessMessage(String message)将自己的线程名写入accessMessage,随机休眠0-5秒,再调用...
双重校验锁模式结合了懒汉模式和饿汉模式的优点,既实现了延迟加载,又保证了线程安全。你可以根据需求选择合适的单例模式实现方式。
该资源是多线程并发下的单例模式-源码,几乎包含了所有方式实现的单例模式,并且能够确保在多线程并发下的线程安全性。 读者可结合本人博客 http://blog.csdn.net/cselmu9?viewmode=list 中的《线程并发之单例模式...
单例模式的七种实现方法以及分析,可以作文大作业提交 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 2.2IDEA简介 4 3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量...
这是一个关于多线程下的单例模式优化代码。public class Singleton { private static Singleton instance; private Singleton (){ } public static Singleton getInstance(){ //对获取实例的方法进行同步 if...
今天小编就为大家分享一篇关于Java多线程实战之单例模式与多线程的实例详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...
单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...
java 三种设计模式Demo 其中对单例模式做了详细的讲解,及性能和线程安全方面的优化其中Singleton.java为经典单例模式。