我在一个安卓应用程序中使用LinkedList,在那里我遇到了竞争条件。一个线程将数据添加到LinkedList中,而另一个线程在检索数据时将其删除。我遇到了一个问题,我的新添加的对象永远不会被处理。
我在Googled上搜索了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;
};
};这真的是我需要的全部吗?
发布于 2012-10-29 02:13:29
如果列表被正确封装到您的对象中(即没有其他对象可以访问列表),并且如果这些是唯一访问列表的方法,那么是的,这就是您所需要的。
关键是,对列表的每次访问都必须在同步块中完成。并且每个同步的块必须在同一对象上同步(在您的代码示例中为list)。
发布于 2012-10-29 02:19:59
在您的例子中是-,如果您的list与对象正确耦合,并且除了这个唯一的方法之外没有其他方法访问它,那么我认为这就足够了。
-此外,还可以使用以下方法:
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;
}
}
}//////////////////////////////////Edited部件/
- Synchronization用于保护data的关键状态,并将其应用于访问要保护其数据的<>D16>的method或atomic statements。
- Every object有且只有一个锁,它将由thread获取,以访问synchronized 方法代码或<>E126>原子语句,它可以访问其instance variables。
-类似的every Class有且只有一个,它将由一个线程获得,以访问synchronized 方法或原子语句,它可以访问它的static variable。
-现在当thread获得对象锁的访问权限之后,它将获得对其同步方法或原子语句的访问权限,并且如果此时另一个线程试图访问相同的对象锁,则该线程将被拒绝访问,并移动到blocked state。
发布于 2012-10-29 02:20:40
是的,这就是你控制你的对象的线程访问的方式。你所要做的就是看看你的方法的时机。只有在列表中添加了数据时,才应调用clear命令。
https://stackoverflow.com/questions/13111533
复制相似问题