惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
C
Check Point Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
博客园 - 司徒正美
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
V
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
O
OpenAI News
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
I
InfoQ
D
Docker
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
M
MIT News - Artificial intelligence
博客园 - Franky
B
Blog
Scott Helme
Scott Helme
博客园 - 叶小钗
D
DataBreaches.Net

博客园 - Sun_china

服务注册中心,Eureka比Zookeeper好在哪里? 数据库锁 【转】数据库连接池优化配置(druid,dbcp,c3p0) scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别 在Spring Boot中使用 @ConfigurationProperties 注解 Shiro简介——《跟我学Shiro》 【转】Lombok 安装、入门 - 消除冗长的 java 代码 java中抽象类是否可以继承实体类? MyBatis中使用#和$书写占位符有什么区别? 什么是悲观锁和乐观锁? java为什么不能根据返回值重载? java中String、StringBuffer、StringBuilder的区别 【转】java面试题 分布式系统中关于转账案例的剖析 支付平台架构师谈大规模高并发服务化系统设计经验 全面了解Ngnix的主要应用的场景 HashMap和HashSet的区别 hashmap和hashtable的区别? java多线程中最佳的实践方案是什么?
java多线程中并发集合和同步集合有哪些?区别是什么?
Sun_china · 2017-04-18 · via 博客园 - Sun_china

java多线程中并发集合和同步集合有哪些?

   hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装:

       包装类Collections.synchronizedMap()和Collections.synchronizedList()提供了一个基本的有条件的线程安全的Map和List实现。

ConcurrentHashMap和Hashtable之间的区别

那么Hashtable和ConcurrentHashMap之间的区别是什么,可以在多线程环境中使用,但一旦Hashtable的大小变得相当大的性能降低,因为迭代它必须被锁定更长的时间。

由于ConcurrentHashMap引入了分段的概念,所以它只有一部分被锁定才能提供线程安全性. 

总而言之,ConcurrentHashMap仅锁定Map的某些部分,而Hashtable在执行迭代时锁定完整映射。 

ConcurrentHashMap和Collections.synchronizedMap之间的区别

ConcurrentHashMap旨在实现并发性能,提高性能,而通过使用synchronized Map应用包装器,可以同步自然不同步的HashMap。

以下是ConcurrentHashMap和Java中的同步映射之间的一些常见区别

    ConcurrentHashMap 不允许空值或空值同步,但是HashMap允许一个空键。

Synchronized vs Concurrent Collections

不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能可扩展性,还有他们如何实现的线程安全。同步HashMap, Hashtable, HashSet, Vector, ArrayList 相比他们并发的实现(比如:ConcurrentHashMap, CopyOnWriteArrayList, CopyOnWriteHashSet)会慢得多。造成如此慢的主要原因是, 同步集合会把整个Map或List锁起来,而并发集合不会。并发集合实现线程安全是通过使用先进的和成熟的技术像锁剥离。比如ConcurrentHashMap 会把整个Map 划分成几个片段,只对相关的几个片段上锁,同时允许多线程访问其他未上锁的片段。

同样的,CopyOnWriteArrayList 允许多个线程以非同步的方式读,当有线程写的时候它会将整个List复制一个副本给它。

如果在读多写少这种对并发集合有利的条件下使用并发集合,这会比使用同步集合更具有可伸缩性。

顺便说一下,集合类是Java API的核心,所以我觉得明智而审慎地使用它们是一门艺术。这是我的个人经验,我通过使用ArrayList替换遗留代码里使用的Vector来提高性能。JDK 1.5引入一些很好的并发集合能高效地开发高容量,低延迟的Java应用程序。

Synchronized Collections vs Concurrent Collections in Java

同步集合类,Hashtable 和 Vector 还有同步集合包装类,Collections.synchronizedMap()和Collections.synchronizedList() 提供了一个基本的有条件的线程安全的Map和List的实现。

所以Hashtable和ConcurrentHashMap的区别是什么,他们都可以在多线程环境中使用,但一旦Hashtable 的大小变得相当大的时候,其性能会降低,因为迭代的时候会被长时间锁定。

然而有一些因素导致他们不适合在高并发应用程序中使用,最主要的原因是在他们的‘集合范围’的锁是程序可伸缩性的一个阻碍。它往往成为必须在相当长一段时间内对集合加锁以防止在迭代期间出现ConcurrentModificationException。

ConcurrentHashMap和CopyOnWriteArrayList不一定在所有地方都是有用的,一般情况下你只需要使用HashMap或ArrayList。

因为ConcurrentHashMap 引入了分片的概念,所以无论集合有多大,她都只对特定的片段进行加锁以保障线程安全,其他的读线程仍然可以访问map而不用等待正在访问的线程遍历结束。

java.util.concurrent包中包含的并发集合类如下:

   ConcurrentHashMap

   CopyOnWriteArrayList

   CopyOnWriteArraySet