【发布时间】:2012-10-28 18:07:48
【问题描述】:
我在一个 android 应用程序中使用LinkedList,在那里我遇到了竞争条件。 1 个线程将数据添加到LinkedList,而另一个线程在检索到它们时将其删除。我遇到了从未处理过我新添加的对象的情况。
我在 Google 上搜索了 Java 同步对象,但要么我想得太简单,要么我遗漏了一些东西。从我读过的内容来看,“对象同步”是两者中比较难的,所以我想知道用sychronized(object) { }; 封装一段代码是否足够?
所以,我有:
public void function addMove(Object move) {
synchronized(list) {
list.add(move);
};
};
public void function second() {
synchronized(list) {
// iterate through the list
list.clear;
};
};
这真的是我所需要的吗?
【问题讨论】:
-
参见 java.util.Collections.synchronizedList。
-
为什么不只是 public void synchronized function() ?
-
您是否遇到语法错误?我不熟悉方法声明中的 function 词。你可能只需要
public void addMove(Object move) {...}和public void second() {...}。 -
为什么使用
clear而不是remove(可能是删除)? -
因为由于竞争条件,我在 remove() 方面遇到了问题。如果在我的迭代循环期间更改了 LinkedList,则 remove() 需要更改的“位置”。所以这会导致错误的项目被删除。只需 clear()'ing 整个列表就可以正常工作了,因为它已经同步了。
标签: java android linked-list synchronized