【问题标题】:Does Collection.SynchronizedList iterator block entire iteration process or just .next() part?Collection.SynchronizedList 迭代器是阻塞整个迭代过程还是仅阻塞 .next() 部分?
【发布时间】:2020-08-21 17:48:47
【问题描述】:

在我问任何问题之前,您可能会告诉我阅读文档。但我仍然是初学者,我处理文档不是那么容易。我的问题是SynchronizedList 中的迭代器是阻止“整个迭代过程(循环)”还是只是它的方法?

含义:当迭代“进行”时,另一个线程可以在synchronizedList instance 上做一些工作吗?或者它可以在调用 next() 的线程之后做一些工作,因为我注意到 next() 也是同步的。

如果有任何帮助,我将不胜感激,谢谢 :)

【问题讨论】:

  • 只是它的方法。该类无法检测它是否正在循环中使用。
  • 这意味着我可以从一个线程将项目添加到列表中,而一个线程正在迭代?这看起来有点糟糕..

标签: java iterator synchronizedcollection


【解决方案1】:

SynchronizedList 中的迭代器是阻止“整个迭代过程(循环)”还是仅阻止其方法?

只是它的方法。

类没有办法检测它是否被循环使用。

如果您需要在整个循环中同步列表,请在列表上进行外部同步:

synchronized (list) {
  for (E element : list) { ... }
}

【讨论】:

  • 但这并不意味着其他线程不能修改列表。我检查了基本方法的实现,它们有自己的键,这意味着这不起作用,对吗?由于您的同步块使用不同的密钥..
  • @AnaMaria 你看过Javadoc吗?
  • 是的。例如: public void add() 使用同步(Vector.this)。并且您使用列表作为键。意味着这行不通。因为它们被锁定到 2 个不同的键
  • @AnaMaria 我的意思是:Javadoc 说这行得通,所以如果您使用的 JDK 版本的编写方式使得这行不通,那么这是一个不正确的实现。请提供您在哪个 JDK/版本中看到“Vector.this”的详细信息,因为在我正在查看的版本中没有看到它。
  • 其实很新(11.0.04)是我的SDK。是的,Vector 方法在 Vector.this 上同步,而在 SynchronizedList 上,它们在最终 Object 互斥锁上同步;我有点不知道在您的情况下同步列表对我们有什么帮助,除非我们使用与内部实现相同的键..
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多