`

Singleton的线程安全

阅读更多

网上可以找到很多种Singleton的实现方式,这些方式要解决的问题主要包括以下几方面:

  1. 线程安全
  2. 序列化
  3. 延迟加载下的线程安全

这个链接解释了这些问题的解决方法,http://www.blogjava.net/kenzhh/archive/2016/03/28/357824.html。

关于volatile关键字,主要有以下作用:

  1. 保证多线程环境下共享变量的可见性(visibility),就是用volatile修饰的变量,在不同的cpu core进行处理的时候会保证cpu高速缓存和主内存之间的及时同步。对变量的修改会立即同步到主内存。所有的变量的读取都从主内存发生。
  2. 从JDK1.5开始,如果线程A修改了volatile变量,线程B之后读取该变量,那么在线程A修改之前对线程A可见的变量,在线程B读取volatile变量之后,对线程B也都可见。
  3. 同样从JDK1.5开始,读取和修改volatile变量的顺序不会被JVM打乱(JVM会为了提升性能在编译时会打乱指令的顺序),修改和读取volatile变量之前或者之后的指令可以被打乱,但是跟随在修改和读取之后的指令会保证在修改和读取之后,而不会跟这些指令混在一起。

Java Volatile Keyword

http://tutorials.jenkov.com/java-concurrency/volatile.html

这篇文章详细介绍了volatile关键字的使用。并且解释了,在多个线程同时对共享的volatile变量进行读写时,volatile是不能保证线程安全的,这时候就必须对变量使用synchronized关键字进行同步。或者使用java.util.concurrent.atomic包下的类达到线程安全的目的。

 

http://jpbempel.blogspot.com/2013/05/volatile-and-memory-barriers.html

这篇文章介绍了,volatile关键字和memeory barrier,说明了为什么java.util.concurrent.atomic下的类可以实现线程安全,以及为什么使用lazySet()可以提升性能。

 

 

分享到:
评论

相关推荐

    linux 下线程安全的singleton

    singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.

    Singleton 单例模式的介绍以及解析

    单例模式 Singleton 单例模式线程安全问题和拓展

    使用C++11实现线程安全的单例模式

    C++11实现线程安全的单例代码和测试代码,包含singleton.h,main.cpp,希望帮助到大家。

    Java并行(4):线程安全前传之Singleton1

    1.寂寞的Singleton 2. 当Singleton遇见多线程 4.安全发布 6. 讨论的延续 1. JavaWorld章:Double-checked l

    C++两种线程安全的单例模式的实现

    使用"懒汉模式"与"饿汉模式"实现c++的单例模式,并且确保了单例模式的第一次实例化的线程安全,以及程序结束时,单例对象的资源收回,以防内存资源的泄漏

    Spring并发访问的线程安全性问题.docx

    springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了...

    深入理解线程安全与Singleton

    在编译器未优化的情况下顺序如下:1.new operator分配适当的内存;2.在分配的内存上构造Singleton对象;3.内存地址赋值给_instance

    C++中多线程与Singleton的那些事儿

     前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton。  看到这个题目后,第一个想法是用Scott Meyer在《Effective C++》中提到的,在static成员函数中...

    linux下线程安全的singleton模板

    singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.

    .Net 多线程详解

    .doc 格式 详细解析多线程技术 基础篇 • 怎样创建一个线程 • 受托管的线程与 Windows线程 • 前台线程与后台线程 ...• 业务逻辑对事务和线程安全的要求 • 计算一下冲突的可能性 • 请多使用lock,少用Mutex

    C++线程安全的单例模式

     需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.  使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。 ...

    C++线程安全的单例模式讲解

    需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety。 使用double-check来保证thread safety。但是如果处理大量数据时,该锁才成为严重的性能瓶颈。 1、...

    spring单例引起的线程安全问题

    二、使用单例引起线程安全问题的例子 那究竟什么时候会用到呢?我相信大多数人写的代码都不会去考虑这个事情,用spring就认为只有单例,也只习惯用单例。但是有时候你想将代码写得更优雅一些的时候,你不得不去思考...

    权威.NET多线程详解(源码示例)

    • 业务逻辑对事务和线程安全的要求 • 计算一下冲突的可能性 • 请多使用lock,少用Mutex Web和IIS • 应用程序池,WebApplication,和线程池之间有什么关系 • Web页面怎么调用异步WebService

    objc-singleton:如何实现安全的 Objective-C 单例

    多线程安全 使用安全,即通过new类方法、init方法仍然返回的是同一个单例对象。new/init方法不做处理用户是可以调用的。 第二点在场景上看起来有些吹毛求疵,用户可以粘贴示例代码或是看一下文档可以做到通过工厂...

    .net 线程详解 基础篇

    * 业务逻辑对事务和线程安全的要求 * 计算一下冲突的可能性 * 请多使用lock,少用Mutex Web和IIS * 应用程序池,WebApplication,和线程池之间有什么关系 * Web页面怎么调用异步WebService

    详解C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式。... singleton& operator=(const singleton&){};//禁止赋值 static T* m_instance; public: static T* GetInstance(); }; templ

    c++线程安全单例模式

    c++单例模式, 需要boost中的function、bind、shared_ptr支持; 很好用; 下载中含简单的测试代码; 原帖:http://blog.csdn.net/CDScan/archive/2009/11/21/4848084.aspx

    Penglq#book-1#1.七种方式实现singleton模式1

    * 静态内部类,使用枚举方式,线程安全(推荐)public enum Singleton6 {* 静态内部类,使用双重校验锁,线程安全(推荐)public st

Global site tag (gtag.js) - Google Analytics