gpt4 book ai didi

Java 集合框架 : Some thread safe and some not?

转载 作者:行者123 更新时间:2023-11-29 08:31:25 25 4
gpt4 key购买 nike

我正在学习 Java 集合框架(不是并发集合框架),我开始知道有些集合实现是线程安全的,有些则不是。

在我阅读的大部分资料中,所有提到的xyz 是线程安全的而abc 不是线程安全的。

但是,是否保持给定集合类型(例如,List、Set、Queue,甚至在 Map.. 中)线程安全的决定基于什么逻辑?

我的问题是关于“传统”集合框架而不是并发集合框架。

理解这一点的任何输入都会有很大帮助。

最佳答案

线程安全会带来开销(尽管在现代 VM 中,开销比设计收集框架时要低得多)。因此,除非特别需要,否则集合不是线程安全的,JDK1.1 集合除外——在设计它们时,其理念更像是“让我们以牺牲一些性能为代价,尽可能少地留出错误空间”。

我们在 Java API 的发展中有几个阶段。

JDK1.1

在 Java 1.1 版本中,我们有数据结构 VectorHashtable。它们完全同步,提供一定程度的线程安全。

JDK1.2

在 Java 1.2 版本中,引入了集合框架。没有一个基本集合是线程安全的(它们不同步任何操作):ArrayListLinkedListHashMapTreeMap Set 实现。

但是您可以通过调用Collections.synchronizedMapCollections.synchronizedList等获得同步版本

JDK1.5

在 Java 1.5 版本中,引入了 java.util.concurrent 框架。它们包含专门为多线程使用而构建的数据。这些提供了一定程度的线程安全。


请注意,即使使用同步集合,也可能引入数据竞争;这仅意味着您不能破坏集合的内部结构(将保留集合的所有不变量)

例如,如果您有一个分两步的过程,您首先检查集合是否不包含某个元素,然后在第二步中插入该元素。如果您不为这两个步骤提供自己的同步,则如果两个线程同时执行此操作,则可以将元素添加两次。

关于Java 集合框架 : Some thread safe and some not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com