【发布时间】:2014-04-15 14:10:57
【问题描述】:
Java并发实战第4章有一段代码sn-p
public class ListHelper<E> {
public List<E> list =
Collections.synchronizedList(new ArrayList<E>());
...
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}
它说这对于使用不同的锁是线程安全的,putIfAbsent 相对于 List 上的其他操作而言不是原子的。 但是我认为防止多线程进入putIfAbsent的“同步”,如果有其他方法对List进行其他操作,关键字同步也应该作为方法属性。那么按照这种方式,它应该是线程安全的吗?什么情况下“不是原子的”?
【问题讨论】:
-
供以后参考。始终将您锁定的对象设为私有,这样外部代码就不会在您不知情的情况下锁定它们。
标签: java multithreading concurrency