最近在看《Java Concurrency in Practice 2nd》一书,作者提到如果我们使用Collections.synchronizedList来创建一个安全线程List,那么我们必须确保我们使用的是同一个锁,它是来自SynchronizedCollection的一个Object。下面的代码来自书中:
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已经被ListHelper中的一个Object锁住了,但是list.contains并没有使用这个Object作为锁,有两个锁,所以在多线程下是不安全的。但我的问题是如何证明它不是线程安全的。你有什么想法?
隔江千里
Cats萌萌
相关分类