首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java / Android: LinkedList竞争条件

Java / Android: LinkedList竞争条件
EN

Stack Overflow用户
提问于 2012-10-29 02:07:49
回答 4查看 914关注 0票数 1

我在一个安卓应用程序中使用LinkedList,在那里我遇到了竞争条件。一个线程将数据添加到LinkedList中,而另一个线程在检索数据时将其删除。我遇到了一个问题,我的新添加的对象永远不会被处理。

我在Googled上搜索了Java同步对象,但是我想得太简单了,或者我错过了一些东西。根据我所读到的,“对象同步”是两个中比较难的,所以我想知道用sychronized(object) { };封装一段代码是否就足够了?

所以,我有:

代码语言:javascript
复制
public void function addMove(Object move) {
  synchronized(list) {
    list.add(move);
  };
};

public void function second() {
   synchronized(list) {
   // iterate through the list
   list.clear;
  };
};

这真的是我需要的全部吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-29 02:13:29

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-29 02:19:59

在您的例子中是-,如果您的list与对象正确耦合,并且除了这个唯一的方法之外没有其他方法访问它,那么我认为这就足够了。

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

代码语言:javascript
复制
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>的methodatomic statements

- Every object有且只有一个锁,它将由thread获取,以访问synchronized 方法代码或<>E126>原子语句,它可以访问其instance variables

-类似的every Class有且只有一个,它将由一个线程获得,以访问synchronized 方法或原子语句,它可以访问它的static variable

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

票数 3
EN

Stack Overflow用户

发布于 2012-10-29 02:20:40

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13111533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档