nan*_*no7 3 java arraylist synchronized thread-safety
再一次关于ArrayList和同步的问题.
我只想知道这个片段到底做了什么:
ArrayList<ObjectX> list = ....;
synchronized (list) {
if (list.contains(objectxy) == false) {
list.add(objectxy);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个填充了ObjectXs的ArrayList.我想在列表中添加一个元素,但前提是列表中不包含相同的元素.我之前检查过(在另一种方法中)如果列表确实包含对象 - 结果为否.但有可能两个线程同时认为结果为no,并且他们都尝试添加objectxy.(还有其他一些必须在中间完成的事情,这就是为什么我无法同步整个过程)
所以,在进程之后,现在线程进入上面的代码片段,我想防止这两个都将对象添加到列表中.所以我想当我同步访问列表时,只有一个线程可以检查它是否包含该对象,然后添加它.在它之后,第二个线程可以访问列表,看到对象已经在其中并且不再添加它.
这就是我想要实现的目标.会有用吗?:-)
所以,如果是的话,我想知道代码片段到底做了什么.是否阻止两个线程同时访问这个确切的代码?这样代码只能同时用于一个线程?
或者它是否一直锁定列表本身,对于此时试图访问列表的应用程序中的任何线程 - 在任何地方?(我的代码中没有其他add(),但是很多得到(),这就是为什么我想知道其他线程是否可以访问列表并且仍然获取元素,而另一个线程正在访问上面的代码).
ArrayList本身是一个成员变量,它使用应用程序与主体连接.如果不是从同一个主体发送的话,多个不同的线程可以同时访问上面的代码是正确的,对吗?
所以,这就是我想知道的.我试图标记我的问题,以便更容易回答它们.谢谢你的帮忙!:-)
[编辑]感谢您的所有答案,几乎所有人都这么说!我觉得现在很清楚!:-)
正确?希望如此 :-)
你几乎拥有它.该synchronized防止了在同一上锁定其他线程list从在同一时间运行其代码块对象.它不会锁定list对象本身.如果其他线程也不在同一对象上进行同步,则仍然可以访问它.
| 归档时间: |
|
| 查看次数: |
5563 次 |
| 最近记录: |