单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,由于一些不太常见的 Java 内存模型细节的原因,并不能保证这个双重检查锁定习语有效。它偶尔会失败,而不是总失败。此外,它失败的原因并不明显,还包含 Java 内存模型的一些隐秘细节。这些事实将导致代...
分类:
编程语言 时间:
2016-06-21 07:40:40
阅读次数:
224
1.定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供 2.类图 3.代码示例 网上最多有8中实现方式,其中包括了很多非线程安全的实现。我觉得没有必要。这里提供单例模式的两种实用实现,均为线程安全,这里推荐第一种实现,即实现了线程安全,又实现了懒加载 另外这里特别提到一下,对于双重检查锁定的 ...
分类:
其他好文 时间:
2016-04-29 07:03:20
阅读次数:
126
背景:我们在实现单例模式的时候往往会忽略掉多线程的情况,就是写的代码在单线程的情况下是没问题的,但是一碰到多个线程的时候,由于代码没写好,就会引发很多问题,而且这些问题都是很隐蔽和很难排查的。 例子1:没有volatile修饰的uniqueInstance 这里面的结果有可能会是:(没有真正重现过, ...
分类:
其他好文 时间:
2016-04-25 19:12:26
阅读次数:
261
双重检查锁定与延迟初始化
在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:
public class UnsafeLazyInitialization {
private static In...
分类:
其他好文 时间:
2015-08-31 17:24:16
阅读次数:
316
问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delet...
分类:
其他好文 时间:
2015-05-07 23:41:38
阅读次数:
205
双重检查锁定的由来 在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否...
分类:
其他好文 时间:
2015-02-05 16:37:52
阅读次数:
189
在web应用中服务器面临的是大量的访问请求,免不了多线程程序,但是有时候,我们希望在多线程应用中的某一个类只能新建一个对象的时候,就会遇到问题。首先考虑单线程,如果要求只能新建一个对象,那么构造函数我们要设为private。简单的想法:class singleton{ private single....
分类:
编程语言 时间:
2015-01-06 02:03:42
阅读次数:
152
Singleton和Double-Checked Locking设计模式,分别指的是单例模式和双重检查锁模式,它们都可以用于确保某个类只有一个对象实例化。两个模式的区别在于:Singleton模式用在单线程应用程序中,而Double-Checked Locking模式用于多线程模式。一、Single...
分类:
其他好文 时间:
2014-09-21 13:09:30
阅读次数:
248