Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 既然已经有了向量,为什么还需要同步的ArrayList?_Java - Fatal编程技术网

Java 既然已经有了向量,为什么还需要同步的ArrayList?

Java 既然已经有了向量,为什么还需要同步的ArrayList?,java,Java,我们什么时候使用同步ArrayList?我们已经有了同步的向量 在java中同步数组列表是什么意思 这意味着它是线程安全的 向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。 在java中同步数组列表是什么意思 这意味着它是线程安全的 向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。 ArrayList未通过同步ArrayList未通过同步 我读到ArrayL

我们什么时候使用同步ArrayList?我们已经有了同步的向量

在java中同步数组列表是什么意思

这意味着它是线程安全的

向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。 在java中同步数组列表是什么意思

这意味着它是线程安全的

向量是同步的。任何涉及向量内容的方法都是线程安全的。 另一方面,ArrayList是不同步的,因此它们不是线程安全的。
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更好,因为它实现了集合和列表接口