在Java中同步字典对象

时间:2015-12-14 12:12:28

标签: java multithreading dictionary

此片段用于将字典文件读入词汇表的ArrayList。这里的_dictionary是所有线程之间的静态共享变量,因此每次触摸此变量时,我都需要保持其锁定(我知道您可以使用Collections.synchronizedList,但出于某些愚蠢的原因我没有使用它)。

然而,过了一段时间我发现了一个问题:2个线程可以同时访问synchronized(_dictionary)中的关键会话。好吧,这不应该发生。有人可以帮助我吗

  synchronized (_dictionary) {
_dictionary = new ArrayList<Vocabulary>();

// Fetch data from file into local dictionary
String nextLine = null;
do {
    nextLine = br.readLine();
    Vocabulary newVocabulary = Vocabulary.parseToVocabulary(nextLine);
    if (newVocabulary != null) {
        _dictionary.add(newVocabulary);
    }
} while (nextLine != null);
}

1 个答案:

答案 0 :(得分:0)

Java的synchronized(x)保持对象级别的锁定。如果更改x的值,则表示您正在更改锁定,并且您正在更改同步部分中的_dictionary。

让我们假设你有两个主题。

线程1 -

  • 到达同步部分
  • _dictionary是ArrayList(instance1)的一个实例,未在instance1上锁定。
  • 进入同步部分
  • 将_dictionary更改为ArrayList(instance2)的新实例
  • 继续......

线程2 -

  • 到达同步部分
  • _dictionary是ArrayList(instance2)的一个实例,并未在instance2上锁定,而是在instance1上锁定。
  • 进入同步部分。
  • (...)

您不应在同步代码块中创建ArrayList的新实例(您每次都要创建一个新对象,而不是共享它)。

您可以查看它的工作原理: https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html