Java Collection Framework:有些线程安全,有些不安全?

好奇心

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

在我阅读的大多数材料中,所有提到的xyz都是线程安全的和abc不是线程安全的。

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

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

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

欧文·博威特

线程安全带来了开销(尽管在现代VM中,开销比设计收集框架时要低得多)。因此,除非特别要求,否则收集不是线程安全的,但JDK1.1收集除外-设计它们时,其理念更像是“以牺牲一些性能为代价,让错误的余地很小”。

Java API的发展分为几个阶段。

JDK1.1

在Java 1.1版中,我们拥有数据结构VectorHashtable它们完全同步,从而提供了一定级别的线程安全性。

JDK1.2

在Java版本1.2中,引入了collections框架。基本藏品都不是线程安全的(他们不同步的任何操作): ,ArrayList实现。LinkedListHashMapTreeMapSet

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

JDK1.5

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


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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HttpClient [Java]处理gzip响应有些困惑

来自分类Dev

Java replaceAll()出现,但有些单词除外

来自分类Dev

为什么有些Java setter方法自动成为Kotlin属性,而有些却没有?

来自分类Java

有些Java 8功能可以在Android SDK 23中使用,而有些则不能?

来自分类Java

java.lang.IllegalArgumentException异常:有些字段缺失(可选或强制)

来自分类Java

为什么有些Java代码再次导入同一包?

来自分类Dev

(Java)为什么有些人仍然使用awt库而不使用swing?

来自分类Java

为什么一些在Java中有些资源不被垃圾收集,必须关闭或autoclosed?

来自分类Java

在Java 9中,为什么在某些情况下对程序包冲突的处理有些不同?

来自分类Java

是什么导致java.util.HashSet和HashMap.keySet()类的iterator()的顺序有些不可预测?

来自分类Java

为什么有些开发人员在Java接口中声明String对象,它如何工作?

来自分类Java

Java 8不安全:xxxFence()指令

来自分类Dev

不安全的发布并发Java

来自分类Dev

分页有些误解

来自分类Dev

边界有些麻烦

来自分类Dev

是否有一些Visual Studio扩展可以检查代码中潜在的线程不安全性?

来自分类Dev

java.util.ConcurrentModificationException:KafkaConsumer对于多线程访问不安全

来自分类Dev

为什么有些MySQL线程永不消亡?

来自分类Java

Java Collection <Object>或Collection <?>

来自分类Java

使用JSON-Simple(Java)在JSON数据中解析十进制数字(其中有些缺少十进制分隔符)

来自分类Dev

如何使用pymongo的collection.update_one或update_many指定不安全/安全写入

来自分类Dev

编写LINQ查询有些困难

来自分类Dev

有些比较到布尔

来自分类Dev

关于访问计数有些困惑

来自分类Dev

守则有些混乱

来自分类Dev

css中的宽度有些混乱

来自分类Dev

for + if循环让我有些问题

来自分类Dev

乘法表有些不同

来自分类Dev

对Django通用视图有些困惑

Related 相关文章

  1. 1

    HttpClient [Java]处理gzip响应有些困惑

  2. 2

    Java replaceAll()出现,但有些单词除外

  3. 3

    为什么有些Java setter方法自动成为Kotlin属性,而有些却没有?

  4. 4

    有些Java 8功能可以在Android SDK 23中使用,而有些则不能?

  5. 5

    java.lang.IllegalArgumentException异常:有些字段缺失(可选或强制)

  6. 6

    为什么有些Java代码再次导入同一包?

  7. 7

    (Java)为什么有些人仍然使用awt库而不使用swing?

  8. 8

    为什么一些在Java中有些资源不被垃圾收集,必须关闭或autoclosed?

  9. 9

    在Java 9中,为什么在某些情况下对程序包冲突的处理有些不同?

  10. 10

    是什么导致java.util.HashSet和HashMap.keySet()类的iterator()的顺序有些不可预测?

  11. 11

    为什么有些开发人员在Java接口中声明String对象,它如何工作?

  12. 12

    Java 8不安全:xxxFence()指令

  13. 13

    不安全的发布并发Java

  14. 14

    分页有些误解

  15. 15

    边界有些麻烦

  16. 16

    是否有一些Visual Studio扩展可以检查代码中潜在的线程不安全性?

  17. 17

    java.util.ConcurrentModificationException:KafkaConsumer对于多线程访问不安全

  18. 18

    为什么有些MySQL线程永不消亡?

  19. 19

    Java Collection <Object>或Collection <?>

  20. 20

    使用JSON-Simple(Java)在JSON数据中解析十进制数字(其中有些缺少十进制分隔符)

  21. 21

    如何使用pymongo的collection.update_one或update_many指定不安全/安全写入

  22. 22

    编写LINQ查询有些困难

  23. 23

    有些比较到布尔

  24. 24

    关于访问计数有些困惑

  25. 25

    守则有些混乱

  26. 26

    css中的宽度有些混乱

  27. 27

    for + if循环让我有些问题

  28. 28

    乘法表有些不同

  29. 29

    对Django通用视图有些困惑

热门标签

归档