网上可以找到很多种Singleton的实现方式,这些方式要解决的问题主要包括以下几方面:
- 线程安全
- 序列化
- 延迟加载下的线程安全
这个链接解释了这些问题的解决方法,http://www.blogjava.net/kenzhh/archive/2016/03/28/357824.html。
关于volatile关键字,主要有以下作用:
- 保证多线程环境下共享变量的可见性(visibility),就是用volatile修饰的变量,在不同的cpu core进行处理的时候会保证cpu高速缓存和主内存之间的及时同步。对变量的修改会立即同步到主内存。所有的变量的读取都从主内存发生。
- 从JDK1.5开始,如果线程A修改了volatile变量,线程B之后读取该变量,那么在线程A修改之前对线程A可见的变量,在线程B读取volatile变量之后,对线程B也都可见。
- 同样从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()可以提升性能。
相关推荐
singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.
单例模式 Singleton 单例模式线程安全问题和拓展
C++11实现线程安全的单例代码和测试代码,包含singleton.h,main.cpp,希望帮助到大家。
1.寂寞的Singleton 2. 当Singleton遇见多线程 4.安全发布 6. 讨论的延续 1. JavaWorld章:Double-checked l
使用"懒汉模式"与"饿汉模式"实现c++的单例模式,并且确保了单例模式的第一次实例化的线程安全,以及程序结束时,单例对象的资源收回,以防内存资源的泄漏
springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了...
在编译器未优化的情况下顺序如下:1.new operator分配适当的内存;2.在分配的内存上构造Singleton对象;3.内存地址赋值给_instance
前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton。 看到这个题目后,第一个想法是用Scott Meyer在《Effective C++》中提到的,在static成员函数中...
singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.
.doc 格式 详细解析多线程技术 基础篇 • 怎样创建一个线程 • 受托管的线程与 Windows线程 • 前台线程与后台线程 ...• 业务逻辑对事务和线程安全的要求 • 计算一下冲突的可能性 • 请多使用lock,少用Mutex
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety. 使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。 ...
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety。 使用double-check来保证thread safety。但是如果处理大量数据时,该锁才成为严重的性能瓶颈。 1、...
二、使用单例引起线程安全问题的例子 那究竟什么时候会用到呢?我相信大多数人写的代码都不会去考虑这个事情,用spring就认为只有单例,也只习惯用单例。但是有时候你想将代码写得更优雅一些的时候,你不得不去思考...
• 业务逻辑对事务和线程安全的要求 • 计算一下冲突的可能性 • 请多使用lock,少用Mutex Web和IIS • 应用程序池,WebApplication,和线程池之间有什么关系 • Web页面怎么调用异步WebService
多线程安全 使用安全,即通过new类方法、init方法仍然返回的是同一个单例对象。new/init方法不做处理用户是可以调用的。 第二点在场景上看起来有些吹毛求疵,用户可以粘贴示例代码或是看一下文档可以做到通过工厂...
* 业务逻辑对事务和线程安全的要求 * 计算一下冲突的可能性 * 请多使用lock,少用Mutex Web和IIS * 应用程序池,WebApplication,和线程池之间有什么关系 * Web页面怎么调用异步WebService
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式。... singleton& operator=(const singleton&){};//禁止赋值 static T* m_instance; public: static T* GetInstance(); }; templ
c++单例模式, 需要boost中的function、bind、shared_ptr支持; 很好用; 下载中含简单的测试代码; 原帖:http://blog.csdn.net/CDScan/archive/2009/11/21/4848084.aspx
* 静态内部类,使用枚举方式,线程安全(推荐)public enum Singleton6 {* 静态内部类,使用双重校验锁,线程安全(推荐)public st