今天在论坛看见一小段代码,不得不佩服作者(
blog)的创新精神。以前在使用Singleton的时候大多采用这样的方式:
java 代码
- public class Singleton {
-
- static Singleton instance;
-
- public static synchronized Singleton getInstance() {
- if (instance == null)
- instance = new Singleton();
- return instance;
- }
-
- }
但这里的问题是synchronization实际上只在
getInstance()第一次调用的时候需要,这个方法在多线程频繁调用的应用中必然会成为效率的瓶颈。
到了java1.5,Bob Lee提到了 Double-Checked Locking (DCL) ,并强调了是infamous DCL;这种做法强调了效率
(但Bob Lee认为volatile 不比synchronized快,另外这种做法会产生更多的代码,所以仍然坚持使用plain old synchronization),并不将整个方法
synchronized,而是只对创建Singleton进行同步,这样,线程进入getInstance(),发现instance 已经创建,就会直接返回instance,而不用在方法外等待。
在这种情况下,Singleton的实现代码一般是这样:
java 代码
- static volatile Singleton instance;
-
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (Singleton.class) {
- if (instance == null)
- instance == new Singleton();
- }
- }
- return instance;
- }
接下来是 Bob Lee的创新做法:
java 代码
- static class SingletonHolder {
- static Singleton instance = new Singleton();
- }
-
- public static Singleton getInstance() {
- return SingletonHolder.instance;
- }
JLS将保证
Singleton instance只在第一次调用getInstance()的时候创建。优雅且快速!
分享到:
相关推荐
在网页开发中,"页面实现Lazy Loading效果"是一种优化用户体验的技术策略,特别是在处理大量图片或者内容的页面时。Lazy Loading,即延迟加载或惰性加载,是指只在用户滚动到可视区域时才加载图片或其他资源,而不是...
In this article I want to discuss the lazy loading mechanism provided by NHibernate. It is recommended for maximum flexibility to define all relations in your domain as lazy loadable. This is the ...
当应用需要加载图片时,特别是网络图片,采用“懒加载”(Lazy Loading)策略是提高性能和节省资源的有效方式。这个“IOS TableView Lazy Loading Demo”就是演示了如何将UITableView与懒加载技术相结合,以优化用户...
Lazy Loading:懒加载的常见问题与解决方案.docx
"lazyloading.rar"这个压缩包文件提供了一个实现移动端图片懒惰加载的解决方案。下面将详细解释这种技术的原理、优势、实现方式以及如何使用压缩包内的文件。 图片懒惰加载是一种优化策略,主要用于网页或应用中,...
Lazy Loading:CSS懒加载策略.docx
Lazy Loading:懒加载技术概论.docx
Lazy Loading:JavaScript懒加载实现.docx
Lazy Loading:懒加载与用户体验.docx
Lazy Loading:视频懒加载实现方法.docx
Lazy Loading:懒加载与SEO优化.docx
Lazy Loading:懒加载与性能优化.docx
0023_极智AI_解读算法部署中需要注意的LazyLoading-个人笔记
Lazy Loading:懒加载框架与库介绍.docx
Lazy Loading:懒加载的历史与发展.docx
Lazy Loading:懒加载未来趋势与研究.docx
在提供的"lazyLoading.rar"压缩包中,包含了一个完整的实现图片懒加载的实例。其中,HTML5页面应该包含了使用`data-src`的`<img>`标签,JavaScript文件(可能是.js后缀)则包含了处理滚动事件和图片加载逻辑的代码。...
Lazy Loading:懒加载在移动应用中的实践.docx
Blazor 懒加载(Lazy Loading)是一种优化Web应用程序性能的技术,主要应用于Blazor框架,它允许我们在需要时才加载特定的组件或模块,而不是一次性加载整个应用。这样可以显著减少初始页面加载时间,提高用户体验,...