java中线程安全的集合

一、java . util . concurrent 包提供了映射 、 有序集和队列的高效实现 : ConcurrentHashMap 、
ConcurrentSkipListMap > ConcurrentSkipListSet 和 ConcurrentLinkedQueue。
这些集合使用复杂的算法, 通过允许并发地访问数据结构的不同部分来使竞争极小化 。
与大多数集合不同, size 方法不必在常量时间内操作 。 确定这样的集合当前的大小通常需要遍历。

注释 : 有些应用使用庞大的并发散列映射 , 这些映射太过庞大 , 以至于无法用 size 方法得到它的大小,因为这个方法只能返回 int。 对于一个包含超过20 亿条目的映射该如何处理 ? JavaSE 8 引入了一个 mappingCount 方法可以把大小作为 long 返回。集合返回弱一致性 ( weakly consistent ) 的迭代器。 这意味着迭代器不一定能反映出它们被构造之后的所有的修改, 但是 , 它们不会将同一个值返回两次 , 也不会拋出 ConcurrentModificationException 异常 。注释 : 与之形成对照的是 , 集合如果在迭代器构造之后发生改变 , java . util 包中的迭代器

将抛出一个 ConcurrentModificationException 异常。

并发的散列映射表 , 可高效地支持大量的读者和一定数量的写者。 默认情况下 , 假定可以有多达 16 个写者线程同时执行。 可以有更多的写者线程 , 但是 , 如果同一时间多于16个, 其他线程将暂时被阻塞 。 可以指定更大数目的构造器 , 然而 , 恐怕没有这种必要 。
 注释 : 散列映射将有相同散列码的所有条目放在同一个 “桶 ” 中。 有些应用使用的散列函数不当 , 以至于所有条目最后都放在很少的桶中, 这会严重降低性能 。 即使是一般意义上还算合理的散列函数,如 String 类的散列函数, 也可能存在问题 。 例如 ,攻击者可能会制造大量有相同散列值的字符串 , 让程序速度减慢。 在 JavaSE 8 中 , 并发散列映射将桶组织为树,
而不是列表, 键类型实现了Comparable , 从而可以保证性能为 0 ( log ⑻ )
 

  •  ConcurrentLinkedQueue < E > ( )构造一个可以被多线程安全访问的无边界非阻塞的队列 。
  • ConcurrentSkipListSet < E > ( )
  • ConcurrentSkipListSet < E > ( Comparator < ? super E > comp )构造一个可以被多线程安全访问的有序集。 第一个构造器要求元素实现 Comparable接口。
  • ConcurrentHashMap<K , V > ( )
  • ConcurrentHashMap < K , V > ( 1 nt 1 n 1 t 1 alCapacity )
  • ConcurrentHashMap<K ,V > ( int initialCapacity , float 1 oadFactor , 1 nt

concurrencyLevel )构造一个可以被多线程安全访问的散列映射表。: initialCapacity 集合的初始容量 。 默认值为 16。

loadFactor 控制调整 : 如果每一个桶的平均负载超过这个因子, 表的大小会被重新调整。 默认值为 0.75 。

concurrencyLevel 并发写者线程的估计数目 。

  • ConcurrentSkipListMap < K , V > ()
  •  ConcurrentSkipListSet < K ,V > ( Comparator < ? super K > comp )

构造一个可以被多线程安全访问的有序的映像表 。 第一个构造器要求键实现Comparable 接口

二、写数组的copy

    CopyOnWriteArrayList 和 CopyOnWriteArraySet 是线程安全的集合, 其中所有的修改线程对底层数组进行复制。 如果在集合上进行迭代的线程数超过修改线程数 , 这样的安排是很有用的。 当构建一个迭代器的时候 , 它包含一个对当前数组的引用 。 如果数组后来被修改了, 迭代器仍然引用旧数组 , 但是 , 集合的数组已经被替换了 。 因而 , 旧的迭代器拥有一致的 ( 可能过时的 ) 视图, 访问它无须任何同步开销 。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java,有几个线程安全集合类可以用于多线程环境下的操作。其包括Vector、Stack、HashTable等。这些集合类通过使用Synchronized来保证线程安全性。不过需要注意的是,官方已经标注Vector和HashTable为即将废弃的类,不建议使用它们。 除了上述的线程安全集合类,还有其他一些较新的线程安全集合类可以使用。其包括CopyOnWriteArrayList、CopyOnWriteArraySet和ConcurrentHashMap等。这些集合类通过特定的机制来实现线程安全性,而且在性能方面也进行了优化。 此外,Java还有Queue接口,它包含了几个线程安全的实现类,如ConcurrentLinkedQueue和BlockingQueue接口的实现类。这些集合类可以在多线程环境下进行安全的队列操作。 总之,在Java有多种线程安全集合类可供选择,可以根据具体的需求和场景选择合适的集合类来保证线程安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java那些线程安全集合类](https://blog.csdn.net/weixin_53946852/article/details/122801143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java线程安全集合](https://blog.csdn.net/weixin_42601136/article/details/107108818)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talNot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值