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
相关产品推荐
相关产品推荐

