当前位置: 首页 > 面试题库 >

同步单例的正确用法?

鲁鹤轩
2023-03-14
问题内容

因此,我正在考虑建立一个业余项目,这只是为了完成我的编程/设计。

它基本上是一个多线程的网络蜘蛛,更新了相同的数据结构object-> int。

因此,为此使用数据库绝对是矫kill过正,而我唯一想到的就是用于包含我的数据结构的线程安全单例。http://web.archive.org/web/20121106190537/http://www.ibm.com/developerworks/java/library/j-dcl/index.html

我应该考虑采用其他方法吗?


问题答案:

双重检查锁定已被证明是不正确和有缺陷的(至少在Java中是如此)。进行搜索或查看Wikipedia的条目的确切原因。

首先是程序的正确性。如果您的代码不是线程安全的(在多线程环境中),则会被破坏。正确性是性能优化之前的第一位。

为了正确起见,您必须同步整个getInstance方法

public static synchronized Singleton getInstance() {
   if (instance==null) ...
}

或静态初始化它

private static final Singleton INSTANCE = new Singleton();


 类似资料:
  • 问题内容: 在查看golang内存模型文档(link)时,我发现go lang上有一个奇怪的行为。该文档说,下面的代码可能会发生,g依次打印2和0。 这是例行公事吗?因为我很好奇为什么变量’b’的值赋值可以先于’a’赋值?即使’a’和’b的值分配将在不同的线程中发生(不在主线程中),是否也必须确保在其自己的线程中将’a’分配在’b’之前?(因为分配’ a’首先出现,’b’之后出现)有人可以清楚地告

  • 那么,回到问题上来,鉴于微软建议不要在新的开发中使用WebRequest而是使用只提供异步API的HttpClient,我该怎么办呢? 这是我正在做的一些伪代码... 如何实现ProcessStuff()?

  • 在多线程环境中用Java实现单例的最佳方法是什么? 当多个线程同时尝试访问方法时会发生什么? 我们可以让Singleton的吗? 当使用单例类时,真的需要同步吗?

  • 问题内容: 我不确定这是否是同步我的的正确方法。 我有一个 从函数传递过来的。 现在,我正在尝试使其同步。这是否正确同步了我的对象? 问题答案: 您要进行两次同步,这是没有意义的,可能会减慢代码的速度:在列表上进行迭代时所做的更改需要整个操作的同步,在这种情况下,使用Using 这样做是多余的(它创建了一个包装程序来同步各个操作)。 但是,由于您要完全清空列表,因此迭代删除第一个元素是最糟糕的方法

  • 我正试图在java(或一般情况下)中了解线程安全性。我有这个类(我希望符合POJO的定义),它还需要与JPA提供商兼容: 如代码中注释行所述,是否有必要将和定义为,并且块是否按其应有的方式使用?或者我应该只使用块,而不将和定义为?的不应与另一个错误匹配。 这个链接说 对于所有声明为volatile的变量(包括long和double变量),读写都是原子的 我是否应该理解通过setter/getter

  • synchronize关键字是否需要应用于实现如下单例模式的类的每个方法? 由于Singleton不公开公共构造函数,并且getInstance()方法是同步的,因此不需要同步方法DoA和Singleton类公开的任何其他公共方法。 这个推理正确吗?