Java并发编程:同步容器
整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3933404.html
1、同步容器出现原因
常用的ArrayList,LinkedList,HashMap,HashSet,Deque等都是线程不安全的;
Java为方便多线程编程,提供了同步容器供用户使用。
2、同步容器类:
2.1:第一类:Vector(ArrayList)、Stack(Vector的子类)、HashTable(HashMap)
2.2:第二类:Collections类中提供的静态工厂方法创建的类。如Collections.synchronizedXxx()获取
3、同步容器的缺陷:
3.1:使用synchronized关键字进行同步降低了效率;
3.2:像Vector这种add和get方法都进行同步,在多线程读时,竞争锁,效率很低。
3.3:多线程操作同步容器时,可能抛出 ConcurrentModificationException异常。
4、ConcurrentModificationException异常原因及解决
4.1:单线程下:Iterator迭代器迭代时,调用了list的remove修改了容器大小,应该调用Iterator的remove方法;
4.2:多线程下:多个线程执行Iterator并修改,此时Iterator线程私有。
改正:【1】获取Iterator时,使用synchronized或者Lock同步。
【2】使用并发容器CopyOnWriteArrayList代替ArrayList和Vector

5、并发容器:java.util.concurrent包
同步容器将所有对容器状态的访问都串行化,保证了安全,却降低了效率;
5.1:ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap()),HashMap同步时锁住所有的段,而ConcurrentHashMap只锁住对应的段(segment);
5.2:CopyOnWriteArrayList和CopyOnWriteArraySet分别代替List和Set,写时复制List和写时复制set;
5.3: 其他

Java并发机制(5)--同步容器与并发容器的更多相关文章

  1. java 异步机制与同步机制的区别

    所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回.所以异步的同义语是非阻塞(None Blocking). 网上有很多网友用很通俗的比喻  把同步和异步讲解的很透彻 转过 ...

  2. 如何正确使用Java异常处理机制

    文章来源:leaforbook - 如何正确使用Java异常处理机制作者:士别三日 第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构 ...

  3. JAVA同步容器和并发容器

    同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取: 在JDK1.2中,引入了同步封装类,可以由Collections.sync ...

  4. Java并发——同步容器与并发容器

    同步容器类 早期版本的JDK提供的同步容器类为Vector和Hashtable,JDK1.2 提供了Collections.synchronizedXxx等工程方法,将普通的容器继续包装.对每个共有方 ...

  5. 【Java并发编程二】同步容器和并发容器

    一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...

  6. java 普通容器,同步容器,并发容器,同步工具

    同步容器,如HashTable,提供独占访问. 并发容器,ConcurrentHashMap,有着更好的并发性能,但是不能独占访问. --putIfAbsent 同步工具: 闭锁:CountDownL ...

  7. Java并发—同步容器和并发容器

    简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector.Ha ...

  8. java多线程总结-同步容器与并发容器的对比与介绍

    1 容器集简单介绍 java.util包下面的容器集主要有两种,一种是Collection接口下面的List和Set,一种是Map, 大致结构如下: Collection List LinkedLis ...

  9. Java并发编程:同步容器

    Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...

随机推荐

  1. [LeetCode]1221. 分割平衡字符串

    在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的. 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串. 返回可以通过分割得到的平衡字符串的最大数量. 示例 1: 输入:s = ...

  2. docker迁移工作目录

    yum安装的docker 工作目录在系统盘,迁移到数据盘 首先需要停止docker服务 systemctl stop docker.service 通过命令df -h 先去看下磁盘大概的情况,找一个大 ...

  3. HMS Core Discovery第13期回顾长文——构建手游中的真实世界

    HMS Core Discovery第13期直播<来吧!构建手游中的真实世界>,已于2月24日圆满结束,本期直播我们同三七游戏的专家一同向小伙伴们分享了HMS Core图形引擎服务(Sce ...

  4. 微服务从代码到k8s部署应有尽有系列(八、各种队列)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  5. Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

    Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制.有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者 ...

  6. [ME]不知道第几次学c语言,仍觉得水深莫测

    首先声明这篇东西是个人的碎碎念,没有任何干货. 接下c语言课助教的活儿时还没什么感觉,快要开学了,才感觉到紧张,逼着自己开始看老师发来的课件,说是查错,其实算是自己再好好学一遍,免得到时候面对同学们的 ...

  7. 用python写九九乘法表

    用python来写九九乘法表,九九乘法表的结构是这样子的: 第一行是1 * 1 = 1,第二行是1 * 2 = 2 | 2 * 2 = 4...以此类推.注意到没,每一行的第一个乘的数字在从1到当行变 ...

  8. 使用 Postman 的 Environments 和 Tests 简化在不同环境中的切换步骤

    调试 API 的时候,我们需要经常需要在本地.开发.生产来回切换,还需要面临 Token 失效等的问题,让人头大,看到一些教程有介绍用 Postman 来简化流程,但是实践起来还是遇到一些问题,所以就 ...

  9. centos7 部署ansible

    Ansible默认采用SSH的方式管理客户端,基于python开发,由paramiko和PyYAMl 两个关键模块构建 支持非root用户管理,支持sudo ansible作用:通过使用ansible ...

  10. C/C++字符串反转的N种方法

    0x00 自己写一个 // 第一种 std::string reverse(std::string str) { std::string res(""); for (int i = ...