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

   

 

java多线程中并发集合和同步集合有哪些?区别是什么?的更多相关文章

  1. Java 8 中如何优雅的处理集合

    Java 8 中如何优雅的处理集合(Stream API) 在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有 ...

  2. Java多线程中的竞争条件、锁以及同步的概念

    竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生“竞争条件”的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作 ...

  3. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  4. [转] JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  5. JAVA多线程和并发基础面试问答

    转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...

  6. 【多线程】JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  7. (转)JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  8. java多线程中最佳的实践方案是什么?

    java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...

  9. JAVA多线程和并发基础面试问答【转】

    JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰 ...

随机推荐

  1. 版本管理工具Git(3)VS2013下如何使用git

    Git系列导航 版本管理工具Git(1)带你认识git 版本管理工具Git(2)git的安装及使用 版本管理工具Git(3)VS下如何使用git VS下创建项目 vs中新建项目MyGitTest201 ...

  2. day33-python阶段性复习七

    rc脚本练习 #!/usr/bin/env python #coding:utf8 import sys import os from subprocess import Popen, PIPE cl ...

  3. javaWeb 字体替换过滤器

    字体替换过滤器继承HttpServletRequestWrapper,重定义了: getParameter(),getParameterValues(),getParameterMap(),增强字节替 ...

  4. HDFS二.HDFS实现分布式文件存储---体系结构

    单击模式(Standalone): 单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置.在这种默认模式下所有3个XML文件均为 ...

  5. Beta 冲刺 (4/7)

    Beta 冲刺 (4/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 准备四六级 展示GitHub当日代码/ ...

  6. hadoop 设置回收站

    我的问题是:hadoop回收站为什么会保留多个过期时间的数据   我们知道hadoop的回收站是在我们删除数据后能恢复的目录,但是我们并不希望在回收站保存太久的数据,我们可以使用如下参数进行配置.   ...

  7. LAMP架构(二)

    第十八次课 LAMP架构(二) 目录 一.Apache默认虚拟主机 二.Apache用户认证 三.域名跳转 四.Apache访问日志 五.访问日志不记录静态文件 六.访问日志切割 七.静态元素过期时间 ...

  8. effective_java第23条:请不要新代码中使用原生态类型

    从这条开始涉及泛型相关的点. 从JDK5开始Java新增了“泛型”新特性,例如:List<String>,在这之前则只有List不会限定类型. 如今的JDK版本中还是可以写原生类型,但这会 ...

  9. C基础学习笔记

    1.C语言运算符优先级: 2.三种循环比较 while.do-while和for三种循环在具体的使用场合上是有区别的,如下: 1).在知道循环次数的情况下更适合使用for循环: 2).在不知道循环次数 ...

  10. java面向对象编程(六)--四大特征之继承

    本文将介绍继承.方法重载和方法覆盖.其中方法重载和方法覆盖是在讲多态时必须要清楚的一个知识点. 一.继承 1.继承的概念 继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变 ...