我正在阅读“ Java并发实践”,这种情况对我来说还不太清楚。为什么这段代码是ThreadSafe?
@ThreadSafe
public class ListHelper<E> {
public List<E> list =
Collections.synchronizedList(new ArrayList<E>());
...
public boolean putIfAbsent(E x) {
synchronized (list) {
boolean absent = !list.contains(x);
if (absent)
} }
}
Run Code Online (Sandbox Code Playgroud)
我们锁定SynchronizedList 列表的实例, 但在使用内部对象的内部
final Object mutex; // Object on which to synchronize
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}
Run Code Online (Sandbox Code Playgroud)
我们仍然在两个不同的对象上具有锁。为什么安全呢?
好问题。您必须遵循分配互斥锁的整个过程。
如果在Collections.synchronizedList作为第二个参数调用时未明确指定,它将是列表本身。
深入到您最终会发现:
mutex = this;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48 次 |
| 最近记录: |