Java 有集合时,为什么列表、集合和映射存在同步包装器。synchronizedCollection()

Java 有集合时,为什么列表、集合和映射存在同步包装器。synchronizedCollection(),java,synchronization,decorator,synchronizedcollection,Java,Synchronization,Decorator,Synchronizedcollection,有人知道我为什么要(例如)将我的列表放在集合中。syncrhonizedList()而不是集合。synchronizedCollection()?它们的工作原理相同吗?这同样适用于地图,集合 还有一件事。为什么没有Collections.synchronizedQueue()?当您使用synchronizedCollection()同步ArrayList时,特定于列表的方法不会同步,因此越具体的方法越好。请注意,方法Collections.synchronizedList()将同步对备份列表的所

有人知道我为什么要(例如)将我的列表放在
集合中。syncrhonizedList()
而不是
集合。synchronizedCollection()
?它们的工作原理相同吗?这同样适用于地图集合


还有一件事。为什么没有
Collections.synchronizedQueue()

当您使用
synchronizedCollection()
同步
ArrayList时,特定于列表的方法不会同步,因此越具体的方法越好。请注意,方法
Collections.synchronizedList()
将同步对备份列表的所有访问,但迭代时除外,迭代仍需要在同步块内完成,同步列表实例作为对象的监视器。还有一件事,当您使用
集合创建同步集合时。synchronizedCollection
如下所示:

Collection c = Collections.synchronizedCollection(yourCollection);

然后,根据文档,返回的集合不会将hashCode和equals操作传递给支持集合,而是依赖于对象的equals和hashCode方法。如果备份集合是集合或列表,则需要保留这些操作的约定。

当您使用
synchronizedCollection()
同步
ArrayList
时,特定于列表的方法不会同步,因此越具体的方法越好。请注意,方法
Collections.synchronizedList()
将同步对备份列表的所有访问,但迭代时除外,迭代仍需要在同步块内完成,同步列表实例作为对象的监视器。还有一件事,当您使用
集合创建同步集合时。synchronizedCollection
如下所示:

Collection c = Collections.synchronizedCollection(yourCollection);

然后,根据文档,返回的集合不会将hashCode和equals操作传递给支持集合,而是依赖于对象的equals和hashCode方法。如果支持集合是集合或列表,则有必要保留这些操作的契约。

首先,
synchronizedCollection
返回
collection
。那么,如果您想执行
List List=Collections.synchronizedCollection(另一个列表)
,该怎么办呢。它不会编译,因为该方法不一定返回列表。。但是为什么没有同步队列呢?大多数队列首先需要是线程安全的。非线程安全队列将不会非常有用。所以不需要一个包装。JDK的目标并不是提供绝对的一切,只是提供最广泛的有用的东西。一个次要的观察:
Map
没有实现
Collection
,所以不能对Map使用
Collections.synchronizedCollection()
。@AnaMaria这样做完全没有意义。您根本没有使用同步列表。您创建的第二个新ArrayList正在复制第一个ArrayList的所有元素。您没有留下线程安全的集合。您也可以调用
ArrayList b=newarraylist(a)
。结果是相同的。对于初学者,
synchronizedCollection
返回
Collection
。那么,如果您想执行
List List=Collections.synchronizedCollection(另一个列表)
,该怎么办呢。它不会编译,因为该方法不一定返回列表。。但是为什么没有同步队列呢?大多数队列首先需要是线程安全的。非线程安全队列将不会非常有用。所以不需要一个包装。JDK的目标并不是提供绝对的一切,只是提供最广泛的有用的东西。一个次要的观察:
Map
没有实现
Collection
,所以不能对Map使用
Collections.synchronizedCollection()
。@AnaMaria这样做完全没有意义。您根本没有使用同步列表。您创建的第二个新ArrayList正在复制第一个ArrayList的所有元素。您没有留下线程安全的集合。您也可以调用
ArrayList b=newarraylist(a)
。结果是一样的,这似乎意味着调用同步方法存在危险,而事实并非如此。在这种情况下,列表被封装在同步集合中。返回类型为
集合
。您甚至无法将返回的对象强制转换为列表,因为它不是列表。
synchronizedCollection
中包装的
ArrayList
没有列表特定的方法,而不是未同步的列表特定的方法。因为它是一个
集合
,而不是
列表
。这似乎意味着调用同步方法存在危险,而事实并非如此。在这种情况下,列表被封装在同步集合中。返回类型为
集合
。您甚至无法将返回的对象强制转换为列表,因为它不是列表。
synchronizedCollection
中包装的
ArrayList
没有列表特定的方法,而不是未同步的列表特定的方法。因为它是
集合
,而不是
列表