首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是Java ClassLoading SingleThreaded吗?

是Java ClassLoading SingleThreaded吗?
EN

Stack Overflow用户
提问于 2015-07-22 04:44:40
回答 2查看 1K关注 0票数 1

在阅读多线程时,我了解到Singleton需要将双重锁定检查和单例引用声明为易失性

  1. 避免了同步开销。
  2. Multiple没有创建多个单例类实例,这是偶然的,请参考本博客。http://javarevisited.blogspot.sg/2014/05/double-checked-locking-on-singleton-in-java.html

我脑子里的问题是,

如果类加载是单线程的,为什么我们关心多线程问题?

静态初始化程序块恰好在应用程序生命周期中执行一次,那么为什么不使用静态初始化程序创建一个单例程序呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-22 05:22:46

  1. 类加载是必单螺纹。从Java 7开始,ClassLoader就可以将自己标记为并行能力
  2. 在静态初始化器中实例化单个实例是很好的。主要的缺点是这些初始化是渴望,而不是懒惰。这可以通过使用按需初始化成语来缓解。但是,请注意,通过创建自定义ClassLoader,可以运行两次静态初始化器。
票数 4
EN

Stack Overflow用户

发布于 2015-07-22 05:00:35

静态初始化程序块只发生一次,这是正确的。实际上,它很懒;只有在实际需要类时才会运行它。因此,我们可以简单而直接地静态地实例化一个对象,并为它提供一个getter。这是使用初始化随需应变的Holder成语演示的:

代码语言:javascript
复制
private static class LazySomethingHolder {
  public static Something something = new Something();
}

public static Something getInstance() {
  return LazySomethingHolder.something;
}

有关详细信息,请参阅http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl。该页面很好地解释了如何替代您所提到的双重锁定机制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31554028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档