java - 为什么 SynchronizedList 线程的这个包装器是安全的?
问题描述
我正在阅读“Java Concurrency in Practice”,这个案例对我来说有点不清楚。为什么这段代码是 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)
} }
}
我们锁定列表的实例, SynchronizedList
但在使用的内部对象内部
final Object mutex; // Object on which to synchronize
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}
我们仍然对两个不同的对象进行了锁定。为什么安全?
解决方案
好问题。您必须遵循分配互斥锁的整个链。
Collections.synchronizedList
如果在作为第二个参数调用时没有明确指定,它将是列表本身。
在内心深处,你最终会发现:
mutex = this;
推荐阅读
- python - 反向交易者绘图错误加载后端'TkAgg'
- c - 如何计算C中调用函数中静态分配的字符串的大小?
- postgresql - Postgres 更新触发器
- swift - 如何在 init(size:) 中使用 self.frame 初始化变量
- atom-editor - Atom 编辑器无法使用 remote-ftp 2.2.4 创建到 AWS Ubuntu 实例的 SFTP 连接
- r - 删除 R 中列值介于 -1 和 1 之间的行
- mongodb - mongoDB 上 $replaceRoot 的替代方法是什么?$replaceRoot 与 documentDB 不兼容
- excel - 复制多个单元格以粘贴到一个单元格中
- javascript - this.$refs 或 document 在mounted() 中不可见,除非我使用 setTimeout
- python - 我正在尝试在 Windows 10 上运行 Hydrogen for atom。当我尝试运行代码时,它会显示很长的错误消息