首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ArrayList、线程和同步-如何对多个线程精确地同步

ArrayList、线程和同步-如何对多个线程精确地同步
EN

Stack Overflow用户
提问于 2011-05-27 09:35:51
回答 6查看 5.7K关注 0票数 3

再一次提出关于ArrayList和同步的问题。

我只想知道这个片段到底是做什么的:

代码语言:javascript
运行
复制
ArrayList<ObjectX> list = ....;

synchronized (list) {
    if (list.contains(objectxy) == false) {
      list.add(objectxy);
    }
}

我有一个充满ObjectX的ArrayList。然后,我想向列表中添加一个元素,但前提是该列表不包含相同的元素。我之前(在另一种方法中)检查了列表是否包含对象-结果是否。但是,有可能两个线程同时认为结果为no,并且它们都试图添加objectxy。(还有一些其他的事情必须在中间做,这就是为什么我不能同步整个过程)

所以,在进程之后,当线程来到上面的片段时,我希望防止这两个线程都将对象添加到列表中。所以我想,当我同步访问列表时,只有一个线程可以检查它是否包含对象,然后添加它。之后,第二个线程可以访问列表,查看对象已经在其中,并且不再添加它。

这就是我想要达到的目标。会成功吗? :-)

所以,如果是的话,我想知道这个片段到底是做什么的。是否阻止两个线程同时访问此精确的代码?这样代码只能同时用于一个线程吗?

还是将列表本身锁定为,对于应用程序中正在尝试访问列表的线程-- anywhere?(我的代码中没有其他add(),但很多是get (),这就是为什么我想知道其他线程是否可以访问列表,并在另一个线程访问上面的代码时仍然获取元素)。

ArrayList本身是一个成员变量,它使用应用程序与主体连接。如果多个线程不是从同一个主体发送的,那么多个不同的线程可以同时访问上面的代码,对吗?

所以,这就是我想知道的。我试着标记我的问题,以便更容易地回答它们。谢谢你的帮助:)

编辑谢谢你所有的答案,这几乎都说了同样的话!我想现在已经很清楚了!

  • 同步代码块只能由一个主体线程访问。(其他主体的线程与特定主体无关)。列表本身可以在任何时候从其他线程访问--只要对它的访问没有与同步块同步。如果是,则线程必须等到可以访问列表(这意味着同步块中没有其他线程同时存在)。

对,是这样?我希望如此:)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-27 09:43:55

同步块保证只有一个线程可以执行此代码块,或者在同一对象(即列表)上同步的任何其他代码块。例如,如果你有

代码语言:javascript
运行
复制
synchronized (list) {
    // block A
}

synchronized (list) {
    // block B
}

,如果一个线程正在执行块A,则没有其他线程可以执行块A或块B,因为它们在同一个对象上都是同步的。但名单本身并没有锁定。另一个线程可能访问列表。

票数 3
EN

Stack Overflow用户

发布于 2011-05-27 09:42:56

你差不多有了。synchronized阻止锁定同一list对象的其他线程同时运行它们的代码块。它不会锁定list对象本身。如果其他线程没有在同一个对象上进行同步,它们仍然可以访问它。

票数 5
EN

Stack Overflow用户

发布于 2011-05-27 09:43:16

是的,一次只有一个线程可以访问该代码块。所有其他线程都将等待,直到先到达的线程完成代码块的执行。

另外,您关于用户主体的假设也是正确的。如果您的数组列表是每个用户一个(主体),那么只有与该用户(主体)一起执行的线程才能在该特定数组列表上同步。

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

https://stackoverflow.com/questions/6150391

复制
相关文章

相似问题

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