我在Java中使用Collections.synchronizedCollection来保护我知道很多线程同时访问的Set。 Java API警告:
“当迭代它时,用户必须手动同步返回的集合:
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block
while (i.hasNext())
foo(i.next());
}
“
如果我使用c.contains(obj)
,那是否是线程安全的?在内部,显然,这是迭代Collection并查看其中的任何对象是否等于obj。我的直觉是假设这可能是同步的(如果不是这似乎是一个重大的失败),但考虑到先前的同步痛苦,仔细检查似乎是明智的,谷歌搜索这方面的答案还没有转变任何事情。
答案 0 :(得分:7)
本身,拨打contains
是安全的。
问题是人们经常测试一个集合是否包含一个元素然后根据结果对集合做了什么。
最有可能的是,测试和操作应该被视为单个原子操作。在这种情况下,应该获得对集合的锁定,并且两个操作都应该在synchronized
块中执行。
答案 1 :(得分:2)
Collections.synchronizedCollection()
将返回thread safe
集合,这意味着
任何单个方法调用本身都是thread safe
。这取决于你想做什么。如果你想调用几个方法,java就不能让它一起保持线程安全。
答案 2 :(得分:1)
这是安全的,因为contains
本身是同步的。