You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对List加synchronized锁迭代时,调用get方法是否会触发线程阻塞?

结论

returnFirst() 方法会被阻塞。

原因说明

  • 首先给出代码的编译问题修正:Collections.synchronizedCollection() 返回值是 Collection 类型,无法直接赋值给 List 变量,要获取线程安全的List实例,正确写法是 List<Integer> lst = Collections.synchronizedList(new ArrayList<>());。
  • Collections 工具类返回的同步包装类(包含synchronizedList、synchronizedCollection)的所有常规成员方法(比如get()、add()、remove()等),内部默认以包装类实例本身作为锁对象加了synchronized同步,和你在iterate()方法中显式使用的synchronized(lst)用的是同一把锁。
  • 当调用iterate()的线程进入同步块时,已经成功持有lst对象的锁,在同步块执行完毕释放锁之前,另一个线程调用lst.get(0)时,get()方法尝试获取同一把锁会失败,从而进入阻塞状态,直到锁被释放才能继续执行。

补充提示

Collections 提供的同步集合的迭代器本身没有加锁,官方文档明确要求迭代操作必须手动对集合实例加锁,你代码里iterate()的写法是符合规范的,可以避免迭代过程中集合结构被修改触发ConcurrentModificationException。

内容的提问来源于stack exchange,提问作者Mason Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:39:03