在看Java Concurrency programm in practice.的客户端编程时。指出同步需要注意是不是同一个锁。书上给出线程安全的方法。
程序清单4-15,P61
public class ListHelper<E> {
public List<E> list = Collections.synchroinedList(new ArrayList<E>());
public synchronized boolean putIfAbsent(E e) {
boolean absent = !list.contains(e);
if (absent) {
list.add(e)
}
return absent;
}
根据我的理解ListHelper的putIfAbsent方法的锁是加在其实例对象上。看了Collections源码,synchronizedList 使用的是同步块,是SynchronizedList 内部类的 final Object mutex 上,为什么是线程安全的?难道是,mutex 是其成员变量,所以会排斥使用成员变量的实现同步?。请给位大神解答, 谢谢。 可以讲一下原理吗?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…