1

LinkedList在一个 android 应用程序中使用 a ,在那里我遇到了竞争条件。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;
  };
};

这真的是我所需要的吗?

4

4 回答 4

3

-在您的情况下,如果您的列表与对象正确耦合并且除了这种唯一方法之外没有其他方法可以访问它,那么我认为这就足够了。

-此外,还可以使用以下方法:

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用于保护数据的关键状态,应用于methodatomic statements访问要field保护其数据的数据。

- Every object拥有一个且只有一个锁,将由 a 获得thread以访问有权访问其的方法synchronized 原子语句instance variables

-类似地,every Class只有一个锁,由线程获取,以访问可以访问其的方法synchronized 原子语句static variable

-现在,当一个thread对象获得对一个对象的锁的访问权,然后它就获得了对其同步方法或原子语句的访问权,如果那时另一个线程试图访问同一个对象锁,那么该线程将被拒绝访问并且它移动到blocked state.

于 2012-10-28T18:19:58.620 回答
1

如果列表被正确封装到您的对象中(即没有其他对象可以访问列表),并且如果这些是访问列表的唯一方法,那么是的,这就是您所需要的。

关键是对列表的每次访问都必须在同步块中完成。并且每个同步块必须在同一个对象上同步(list在您的代码示例中)。

于 2012-10-28T18:13:28.657 回答
0

是的,这是您可以控制对象的线程访问的方式。您所要做的就是查看您的方法的时机。仅当列表中添加了数据时才应调用 clear 命令。

于 2012-10-28T18:20:40.307 回答
0

我不知道Android是否支持Java 5,但是java.util.concurrent包含很多优秀的类来支持队列,比如ConcurrentLinkedQueue。

于 2012-10-29T05:07:01.463 回答