线程安全单例

时间:2011-04-26 04:21:42

标签: java multithreading singleton thread-safety

  

可能重复:
  Thread safety in Singleton

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

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

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

这在单线程环境中工作正常。但是在多线程环境中,这没有按预期工作。程序在一段时间后就会卡住。

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

3 个答案:

答案 0 :(得分:2)

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

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

如果使用相同的锁进行同步,使用包装器封装对Dictionary的所有调用,则migth可以使用线程安全的解决方案。

答案 1 :(得分:1)

来自消息来源:

你有遍及此库的迭代器和状态:

/**
 * Main word lookup procedure. First try a normal lookup. If that doesn't work,
 * try looking up the stemmed form of the lemma.
 * @param pos the part-of-speech of the word to look up
 * @param lemma the lemma to look up
 * @return IndexWord the IndexWord found by the lookup procedure, or null
 *              if an IndexWord is not found
 */
public IndexWord lookupIndexWord(POS pos, String lemma) throws JWNLException {
    lemma = prepareQueryString(lemma);
    IndexWord word = getIndexWord(pos, lemma);
    if (word == null && getMorphologicalProcessor() != null) {
        word = getMorphologicalProcessor().lookupBaseForm(pos, lemma);
    }
    return word;
}



/**
 * Return a set of <code>IndexWord</code>s, with each element in the set
 * corresponding to a part-of-speech of <var>word</var>.
 * @param lemma the word for which to lookup senses
 * @return An array of IndexWords, each of which is a sense of <var>word</var>
 */
public IndexWordSet lookupAllIndexWords(String lemma) throws JWNLException {
    lemma = prepareQueryString(lemma);
    IndexWordSet set = new IndexWordSet(lemma);
    for (Iterator itr = POS.getAllPOS().iterator(); itr.hasNext();) {
        IndexWord current = lookupIndexWord((POS)itr.next(), lemma);
        if (current != null) set.add(current);
    }
    return set;
}

在POS中我们找到了

private static final List ALL_POS =
    Collections.unmodifiableList(  /* alphazero: this is good news .. */
            Arrays.asList(new POS[] {NOUN, VERB, ADJECTIVE, ADVERB}));

public static List getAllPOS() {
    return ALL_POS;
}

尝试林奇的回答。它应该工作。

答案 2 :(得分:0)

您可以使用其中一个concurrent containers ...

或者,您可以在单例实例中使用同步(有人已在评论中发布了线程安全单例的链接)。