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

synchronized块是否会阻止其他线程向同步列表插入元素?

Java SynchronizedList 锁互斥问题解答

核心底层逻辑:

  • Collections.synchronizedList 返回的包装列表,所有自带的成员方法(比如add())的底层实现,都是以列表实例自身作为锁对象加synchronized同步的
  • 代码中traverseArray方法的同步块,显式指定的锁对象也是mlist自身,二者用的是同一把锁

问题1:线程调用addStuff()添加元素时,另一线程能否进入traverseArray的同步块?

答案是不能。
调用mlist.add()时,方法底层已经成功持有了mlist对象的锁,在add方法执行完成释放锁之前,其他尝试获取mlist锁的线程都会被阻塞,自然无法进入以mlist为锁的同步块。

问题2:线程处于traverseArray的同步块中时,另一线程能否调用addStuff()插入元素?

答案也是不能。
进入同步块就代表当前线程已经持有了mlist的锁,此时其他线程调用add方法时,需要先获取mlist的锁才能执行,拿不到锁就会进入阻塞状态,直到锁被释放才能继续执行。

额外补充:你代码里遍历同步列表时手动加mlist对象锁的写法是符合规范的,因为SynchronizedList的迭代器没有做同步处理,如果遍历过程中不加锁,其他线程修改列表会触发ConcurrentModificationException异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:54:04