再一次提出关于ArrayList和同步的问题。
我只想知道这个片段到底是做什么的:
ArrayList<ObjectX> list = ....;
synchronized (list) {
if (list.contains(objectxy) == false) {
list.add(objectxy);
}
}
我有一个充满ObjectX的ArrayList。然后,我想向列表中添加一个元素,但前提是该列表不包含相同的元素。我之前(在另一种方法中)检查了列表是否包含对象-结果是否。但是,有可能两个线程同时认为结果为no,并且它们都试图添加objectxy。(还有一些其他的事情必须在中间做,这就是为什么我不能同步整个过程)
所以,在进程之后,当线程来到上面的片段时,我希望防止这两个线程都将对象添加到列表中。所以我想,当我同步访问列表时,只有一个线程可以检查它是否包含对象,然后添加它。之后,第二个线程可以访问列表,查看对象已经在其中,并且不再添加它。
这就是我想要达到的目标。会成功吗? :-)
所以,如果是的话,我想知道这个片段到底是做什么的。是否阻止两个线程同时访问此精确的代码?这样代码只能同时用于一个线程吗?
还是将列表本身锁定为,对于应用程序中正在尝试访问列表的线程-- anywhere?(我的代码中没有其他add(),但很多是get (),这就是为什么我想知道其他线程是否可以访问列表,并在另一个线程访问上面的代码时仍然获取元素)。
ArrayList本身是一个成员变量,它使用应用程序与主体连接。如果多个线程不是从同一个主体发送的,那么多个不同的线程可以同时访问上面的代码,对吗?
所以,这就是我想知道的。我试着标记我的问题,以便更容易地回答它们。谢谢你的帮助:)
编辑谢谢你所有的答案,这几乎都说了同样的话!我想现在已经很清楚了!
对,是这样?我希望如此:)
发布于 2011-05-27 01:43:55
同步块保证只有一个线程可以执行此代码块,或者在同一对象(即列表)上同步的任何其他代码块。例如,如果你有
synchronized (list) {
// block A
}
synchronized (list) {
// block B
}
,如果一个线程正在执行块A,则没有其他线程可以执行块A或块B,因为它们在同一个对象上都是同步的。但名单本身并没有锁定。另一个线程可能访问列表。
发布于 2011-05-27 01:42:56
你差不多有了。synchronized
阻止锁定同一list
对象的其他线程同时运行它们的代码块。它不会锁定list
对象本身。如果其他线程没有在同一个对象上进行同步,它们仍然可以访问它。
发布于 2011-05-27 01:43:16
是的,一次只有一个线程可以访问该代码块。所有其他线程都将等待,直到先到达的线程完成代码块的执行。
另外,您关于用户主体的假设也是正确的。如果您的数组列表是每个用户一个(主体),那么只有与该用户(主体)一起执行的线程才能在该特定数组列表上同步。
https://stackoverflow.com/questions/6150391
复制相似问题