Java 既然已经有了向量,为什么还需要同步的ArrayList?
我们什么时候使用同步ArrayList?我们已经有了同步的向量 在java中同步数组列表是什么意思 这意味着它是线程安全的 向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。 在java中同步数组列表是什么意思 这意味着它是线程安全的 向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。Java 既然已经有了向量,为什么还需要同步的ArrayList?,java,Java,我们什么时候使用同步ArrayList?我们已经有了同步的向量 在java中同步数组列表是什么意思 这意味着它是线程安全的 向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。 在java中同步数组列表是什么意思 这意味着它是线程安全的 向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。 ArrayList未通过同步ArrayList未通过同步 我读到ArrayL
ArrayList未通过同步ArrayList未通过同步 我读到ArrayList是同步的 爪哇 但是他说 请注意,此实现不可用 同步的 因此,当您确定不会处理并发性时,可以使用ArrayList。 使用Vector可能是一种过激行为,并可能导致性能问题 我读到ArrayList是同步的 爪哇 但是他说 请注意,此实现不可用 同步的 因此,当您确定不会处理并发性时,可以使用ArrayList。
使用Vector可能是一种过度使用,可能会导致性能问题。我认为您弄错了 同步意味着每个操作都是线程安全的——如果您同时使用来自两个线程的同一向量,它们就不会破坏状态。但是,这会使速度变慢
如果您在单线程环境中工作,或者列表仅限于一个线程且从不共享,请使用ArrayList。如果您正在处理共享同一集合的多个线程,请使用Vector或ArrayList,但以其他方式(例如,手动或通过包装器)进行同步 我想你搞错了 同步意味着每个操作都是线程安全的——如果您同时使用来自两个线程的同一向量,它们就不会破坏状态。但是,这会使速度变慢 如果您在单线程环境中工作,或者列表仅限于一个线程且从不共享,请使用ArrayList。如果您正在处理共享同一集合的多个线程,请使用Vector或ArrayList,但以其他方式(例如,手动或通过包装器)进行同步 可调整大小的数组实现 列表界面。实现所有 可选列表操作和许可证 所有元素,包括null。在里面 除了执行清单之外 接口,该类提供方法 操纵数组大小的步骤 在内部用于存储 列表这门课大概是 等价于向量,只是它 是不同步的 在您知道不需要线程安全的情况下(例如,完全封装的私有数据),这可以避免一些性能问题。但是,ArrayList和Vector在对其使用迭代器时都存在问题:在对任一类型的集合进行迭代时,如果添加或删除了数据,则: 请注意,此实现不可用 同步的。如果有多个线程 访问ArrayList实例 同时,以及至少一个 线程修改列表 从结构上讲,它必须是同步的 外部。结构修改 是添加或删除的任何操作 一个或多个元素,或显式地 调整背衬阵列的大小;仅仅 不允许设置元素的值 结构上的修改。这是 通常由 在某个对象上同步 自然地封装了列表。如果没有 如果存在这样的对象,则列表应为 使用 Collections.synchronizedList方法。 这最好在创建时完成,以便 防止意外不同步 访问列表: 列表= Collections.synchronizedListnew ArrayList 这个类的 迭代器和listIterator方法是 快速失败:如果列表在结构上是 修改后的任何时间 迭代器是以任何方式创建的,除了 通过迭代器自己的移除或 如果添加方法,迭代器将抛出 ConcurrentModificationException。因此 面对并行 修改后,迭代器将失败 迅速而干净,而不是 冒着武断、不确定的风险 在不确定的时间内的行为 未来 请注意 迭代器无法保证,因为它 一般来说,这是不可能的 在市场上做出任何硬保证 存在未同步的并发数据 修改快速失效迭代器 抛出ConcurrentModificationException 尽最大努力。因此, 写这样的程序是错误的 依赖于此异常的 正确性:的快速失败行为 迭代器只能用于 检测错误 然而,ArrayList有多种有用的风格,而Vector没有。我个人最喜欢的是:< /p> ArrayList的一种线程安全变体,在该变体中,所有可变操作add、set等都是通过创建底层数组的新副本来实现的 这通常成本太高,但在遍历操作的数量远远超过变异时,可能比其他方法更有效,并且在您不能或不想同步遍历,但需要排除并发线程之间的干扰时非常有用。快照样式迭代器方法使用对创建迭代器时数组状态的引用。该数组在迭代器的生命周期内不会更改,因此不可能发生干扰,并且迭代器保证不会抛出ConcurrentModificationException。自创建迭代器以来,迭代器不会反映对列表的添加、删除或更改。不支持迭代器本身的元素更改操作remove、set和add。这些方法引发UnsupportedOperationException CopyonWriteArrayList在GUI工作中非常有用,尤其是在显示更新数据集的情况下,例如在屏幕上移动图标。如果您可以容忍显示的数据列表过期一帧,因为您的生产者线程略落后于图形更新线程,那么CopyonWriteArrayList是完美的数据结构 可调整大小的数组实现 列表界面。实现所有 可选列表操作和许可证 所有元素,包括null。在里面 除了执行清单之外 接口,该类提供方法 操纵数组大小的步骤 在内部用于存储 列表这门课大概是 等价于向量,只是它 是不同步的 在您知道不需要线程安全的情况下(例如,完全封装的私有数据),这可以避免一些性能问题。但是,ArrayList和Vector在对其使用迭代器时都存在问题:在对任一类型的集合进行迭代时,如果添加或删除了数据,则: 请注意,此实现不可用 同步的。如果有多个线程 访问ArrayList实例 同时,以及至少一个 线程修改列表 从结构上讲,它必须是同步的 外部。结构修改 是添加或删除的任何操作 一个或多个元素,或显式地 调整背衬阵列的大小;仅仅 不允许设置元素的值 结构上的修改。这是 通常由 在某个对象上同步 自然地封装了列表。如果没有 如果存在这样的对象,则列表应为 使用 Collections.synchronizedList方法。 这最好在创建时完成,以便 防止意外不同步 访问列表: 列表= Collections.synchronizedListnew ArrayList 这个类的 迭代器和listIterator方法是 快速失败:如果列表在结构上是 修改后的任何时间 迭代器是以任何方式创建的,除了 通过迭代器自己的移除或 如果添加方法,迭代器将抛出 ConcurrentModificationException。因此 面对并行 修改后,迭代器将失败 迅速而干净,而不是 冒着武断、不确定的风险 在不确定的时间内的行为 未来 请注意 迭代器无法保证,因为它 一般来说,这是不可能的 在市场上做出任何硬保证 存在未同步的并发数据 修改快速失效迭代器 抛出ConcurrentModificationException 尽最大努力。因此, 写这样的程序是错误的 依赖于此异常的 正确性:的快速失败行为 迭代器只能用于 检测错误 然而,ArrayList有多种有用的风格,而Vector没有。我个人最喜欢的是: ArrayList的一种线程安全变体,在该变体中,所有可变操作add、set等都是通过创建底层数组的新副本来实现的 这通常成本太高,但在遍历操作的数量远远超过变异时,可能比其他方法更有效,并且在您不能或不想同步遍历,但需要排除并发线程之间的干扰时非常有用。快照样式迭代器方法使用对创建迭代器时数组状态的引用。该数组在迭代器的生命周期内不会更改,因此不可能发生干扰,并且迭代器保证不会抛出ConcurrentModificationException。自创建迭代器以来,迭代器不会反映对列表的添加、删除或更改。不支持迭代器本身的元素更改操作remove、set和add。这些方法引发UnsupportedOperationException CopyonWriteArrayList在GUI工作中非常有用,尤其是在显示更新数据集的情况下,例如移动i
屏幕上的罪犯。如果您可以容忍显示的数据列表过期一帧,因为您的生产者线程稍微落后于图形更新线程,那么CopyOnWriteArrayLists是完美的数据结构。虽然Vector是线程安全的,但Vector的典型用法不会。@Tom:我想这取决于应用程序,不是吗?如果没有进一步的锁定,向量是线程安全的,那么你可以做的事情就不多了。作为一个随机的例子,你不能读取它的大小,然后通过索引获取或设置一个值。虽然Vector是线程安全的,但是Vector的典型用法不会是线程安全的。@Tom:我想这取决于应用程序,不是吗?如果不进一步锁定,你就不能使用线程安全的Vector。作为一个随机的例子,你不能读取它的大小,然后通过索引获得或设置一个值。+1来击败我推荐考尔。Vector最近很不受欢迎,我很惊讶整个类都没有被弃用;CopyOnWriteArrayList是一个可爱的小动物,可以让你避免各种各样的问题。@BlairHippo,我同意。事实上,当你阅读数据时,你可以忽略有人在你的数据上写东西的可能性,这让世界变得更加阳光明媚;设计用于收集的库方法并不总是预期可能会提供COWAL;例如,静态getLastElementList方法通常由同步列表{return list.getlist.size-1;}实现,这对于COWAL来说是完全中断的。只是一个小警告,仅此而已。只要我们讨论的是鬼鬼祟祟的gotchas:CopyOnWriteArrayList.subList返回一个列表,而不是一个COWAL,正如人们所期望的那样。这会让你的头发脱落,让人沮丧-@鲍勃·克罗斯:别忘了下雪。多线程对你来说是雪上加霜。雪是由痛苦构成的。美丽的,结晶的痛苦。+1因为打败我推荐科瓦尔。Vector最近很不受欢迎,我很惊讶整个类都没有被弃用;CopyOnWriteArrayList是一个可爱的小动物,可以让你避免各种各样的问题。@BlairHippo,我同意。事实上,当你阅读数据时,你可以忽略有人在你的数据上写东西的可能性,这让世界变得更加阳光明媚;设计用于收集的库方法并不总是预期可能会提供COWAL;例如,静态getLastElementList方法通常由同步列表{return list.getlist.size-1;}实现,这对于COWAL来说是完全中断的。只是一个小警告,仅此而已。只要我们讨论的是鬼鬼祟祟的gotchas:CopyOnWriteArrayList.subList返回一个列表,而不是一个COWAL,正如人们所期望的那样。这会让你的头发脱落,让人沮丧-@鲍勃·克罗斯:别忘了下雪。多线程对你来说是雪上加霜。雪是由痛苦构成的。美丽的,结晶的痛苦。向量已经过时了,请看-向量在每个单独的操作上都是同步的。这几乎不是你想做的,我同意。我很久没有使用向量了。但我仍然在代码中看到很多。ArrayList因为命名而困扰我。这就像是一个词中不应该包含的两个词的混合体。Vector几乎已经过时了,请参见-Vector在每个单独的操作上进行同步。这几乎不是你想做的,我同意。我很久没有使用向量了。但我仍然在代码中看到很多。ArrayList因为命名而困扰我。这就像是两件不应该属于同一个词的东西的混合。我建议进一步编辑这个问题:那里有有用的内容。示例标题:当我们已经有向量时,为什么我们需要同步的ArrayList?您可以使用java.util.Collections“同步”ArrayList-这就是您在问题中的意思吗?这可能比Vector更好,因为它实现了收集和列表界面。我建议进一步编辑这个问题:那里有有用的内容。示例标题:当我们已经有向量时,为什么我们需要同步的ArrayList?您可以使用java.util.Collections“同步”ArrayList-这就是您在问题中的意思吗?这可能比Vector更好,因为它实现了集合和列表接口