此片段用于将字典文件读入词汇表的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);
}
答案 0 :(得分:0)
Java的synchronized(x)保持对象级别的锁定。如果更改x的值,则表示您正在更改锁定,并且您正在更改同步部分中的_dictionary。
让我们假设你有两个主题。
线程1 -
线程2 -
您不应在同步代码块中创建ArrayList的新实例(您每次都要创建一个新对象,而不是共享它)。
您可以查看它的工作原理: https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html