我在Android应用程序中使用LinkedList
,在那里我遇到了竞争条件。 1个线程将数据添加到LinkedList
,而另一个线程在检索时删除它们。我遇到了从未处理过新添加的对象的问题。
我用谷歌搜索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;
};
};
这真的是我需要的吗?
如果列表被正确封装到您的对象中(即没有其他对象可以访问该列表),并且如果这些是访问该列表的唯一方法,那么是的,这就是您所需要的。
关键是每次访问列表都必须在同步块中完成。每个同步块必须在同一个对象上同步(list
,在你的代码示例中)。
- 在您的情况下,如果您的列表与Object正确耦合,除了这种方法之外没有其他方法可以访问它,那么我认为这就足够了。
- 此外,还可以使用以下方法:
public class Test{
private LinkedList<Object> list = new LinkedList<Object>();
public void function addMove(Object move) {
synchronized(this) {
list.add(move);
}
}
public void function second() {
synchronized(this) {
list.clear;
}
}
}
//////////////////////////////////编辑部////////////// /////////
- Synchronization
用于保护关键的数据状态,并应用于访问method
的atomic statements
或field
,其数据将受到保护。
- Every object
有一个且只有一个锁,这是由thread
获取来访问synchronized
方法或原子语句,可以访问其instance variables
。
- 类似地,every Class
只有一个锁,它可以通过线程获取来访问synchronized
方法或有权访问其static variable
的原子语句。
- 现在当thread
获得对象锁定的访问权限之后,它会获得对其同步方法或原子语句的访问权限,并且如果此时另一个线程尝试访问同一个对象锁定,则该线程被拒绝访问它移动到blocked state
。
是的,这是控制对象线程访问的方式。您所要做的就是查看方法的时间。只有在列表中添加了数据时才应调用clear命令。
我不知道Android是否支持Java 5,但java.util.concurrent包含许多支持队列的优秀类,例如ConcurrentLinkedQueue。