java - 线程安全单例

标签 java multithreading singleton thread-safety

Possible Duplicate:
Thread safety in Singleton

嗨,

我正在使用 wordnet 词典来查找单词的同义词。由于我有很多文档,我使用了多个线程来进行文档预处理,其中包括词干提取、停用词删除和同义词替换。

我使用以下代码来访问字典并获取每个文档的单词集。

IndexWordSet set = Dictionary.getInstance().lookupAllIndexWords(newWord);

这在单线程环境中工作得很好。但在多线程环境中,这并不能按预期工作。程序在一段时间后卡住了。

这是因为 Dictionary.getInstance()是一个单例类并且它不是线程安全的?如果是这样,我如何修改对字典的访问以使其线程安全? (我无法修改字典类,因为我使用了字典库)

最佳答案

为您的 Dictationary 实例编写一个包装器。在此包装器中同步访问以确保一次只有一个线程可以访问lookupAllIndexWords()。

public class DictionaryIndexer {
   public static IndexWordSet lookupAllIndexWords(newWord) {
       final Dictionary instance = Dictionary.getInstance();
       synchronized (instance) {
           return instance.lookupAllIndexWords(newWord);
       }
   }
}

如果您使用相同的同步锁通过包装器封装对 Dictionary 的所有调用,您可能能够获得线程安全的解决方案。

关于java - 线程安全单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5785897/

相关文章:

multithreading - 为什么单个 CPU 核心上不会出现指令重排序问题?

c# - 4 核 PC 上的 c# 程序中的线程激活顺序

Java:使单例不那么冗长

Java - 如何通过快捷方式传递参数

java - 从 Java 字符串中删除特殊字符

java - Java 编写互斥锁的最快方法?

java - Spring 存储库自动转换具有不同类类型的实体

Android Handlers - 线程间通信

java - 如何使用对象的同一个实例

java - 双重检查锁定模式 : Broken or not?