Java / Android:LinkedList竞争条件

问题描述 投票:1回答:4

我在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;
  };
};

这真的是我需要的吗?

java android linked-list synchronized
4个回答
1
投票

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

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


3
投票

- 在您的情况下,如果您的列表与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用于保护关键的数据状态,并应用于访问methodatomic statementsfield,其数据将受到保护。

- Every object有一个且只有一个锁,这是由thread获取来访问synchronized方法或原子语句,可以访问其instance variables

- 类似地,every Class只有一个锁,它可以通过线程获取来访问synchronized方法或有权访问其static variable的原子语句。

- 现在当thread获得对象锁定的访问权限之后,它会获得对其同步方法或原子语句的访问权限,并且如果此时另一个线程尝试访问同一个对象锁定,则该线程被拒绝访问它移动到blocked state


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.