/*ConcurrentHashMap*/

Java 5.0 在 java.util.concurrent 包中提供了 多种 并发容器来改进同步容器的性能

ConcurrentHashMap 同步容器类 是 Java5 增加的一个线程安全的 哈希表。对于多线程的操作,介于HashMap 与 HashTable 之间

  HashMap 是线程不安全的,不支持并发操作

  HashTable 是线程安全的,采用的独占锁,即一次只能有一个线程对容器进行操作

  HashTable 还有一个问题,当执行一些复合操作,如:若存在,则删除,  if(!table.contans()) { table.put() } ,同样可能出现线程问题

ConcurrentHashMap 介于 HashMap 与 Hashtable 之间。内部采用 “锁分段”机制替代Hashtable的独占锁。进而提高性能(在jdk1.8之后,底层就不采用锁分段的方式了,而是采用CAS算法)

锁分段:

  有一个concurrentLevel(分段级别)(默认的级别为16),将锁分成16段,每个段都是一个独立的锁,每段锁会有16(默认)个Entry

  当有多个线程并发访问时,可以访问不同的段,实现了并行, 提高了效率,并且提供了一些复合操作的方法

/*其他并发容器类*/

JUC 还提供了其他用于多线程上下文中Collection 实现(以前只能 用synchronize 来同步这些集合的方法,实现同步):

ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet

  1.当期望许多线程访问一个 给定collection 时,ConcurrentHashMap通常优于同步的HashMap

  2.ConcurrentSkipListMap 通常优于同步的TreeMap。

  3.当期望的读数 和 遍历 远远大于列表的更新数时,CopyOnWriteArrayList优于同步的ArrayList,

  但是 CopyOnWriteArrayList 因为每次更新都会进行复制,开销非常大,并发迭代操作多时可以选择

  1. /*
  2. * CopyOnWriteArrayList /CopyOnWriteArraySet : "写入并复制"
  3. * Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,
  4. *
  5. * 从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。
  6. *
  7. * 当出现并发,多个线程想对这个内容进行操作,读操作的时候,无所谓,读的都是同一份,也不会加锁;;
  8. * 写操作的时候,为了避免修改同一份,采用的策略是,把内容Copy出去形成一个新的内容然后再改,以此来避免并发问题
  9. *
  10. * 从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。
  11. * CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到
  12. *
  13. * 注意 :添加操作多时,效率低因为每次添加时都会将当前List复制一份,开销非常的大。并发迭代操作时可以选择
  14. * */
  15. public class TestCopyOnWriteArrayList {
  16. public static void main(String[] args) {
  17. ListThread lt = new ListThread();
  18. for(int i = 0;i<10;i++) {
  19. new Thread(lt).start();
  20. }
  21. }
  22. }
  23.  
  24. class ListThread implements Runnable {
  25. //private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); 使用 这种同步的ArrayList,当遍历的时候进行 add 操作,就会报错
  26. private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
  27. static {
  28. list.add("1");
  29. list.add("2");
  30. list.add("3");
  31. }
  32. @Override
  33. public void run() {
  34. Iterator<String> iterator = list.iterator();
  35. while(iterator.hasNext()) {
  36. System.out.println(iterator.next());
  37. list.add("4");
  38. }
  39. }
  40.  
  41. }

3.ConcurrentHashMap 锁分段机制 Copy-On-Write的更多相关文章

  1. java多线程 -- ConcurrentHashMap 锁分段 机制

    hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能. Conc ...

  2. 四、ConcurrentHashMap 锁分段机制

    回顾: HashMap与Hashtable的底层都是哈希表,但是 HashMap:线程不安全 Hashtable:线程安全,但是效率非常低,且存在[复合操作](如"若存在则删除") ...

  3. 3、JUC--ConcurrentHashMap 锁分段机制

    ConcurrentHashMap  Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能.  ConcurrentHashMap 同步容器 ...

  4. ConcurrentHashMap(锁分段技术)

    线程不安全的HashMap     因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap.   效率低下的HashTab ...

  5. Java:ConcurrentHashMap的锁分段技术

    术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值.  哈希表 hash table 根据设定的哈希函数H(ke ...

  6. Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性

    一.背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的.当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种 ...

  7. 操作系统篇-分段机制与GDT|LDT

    || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的. ...

  8. 【JAVA并发编程实战】9、锁分段

    package cn.study.concurrency.ch11; /** * 锁分段 * @author xiaof * */ public class StripedMap { //同步策略:就 ...

  9. Oracle锁的机制

    一.为什么要有锁的机制 我们都知道数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破 ...

随机推荐

  1. linux禁止特定ip访问某个端口

    linux禁止特定ip访问某个端口   解决方法: 禁止特定ip访问8501端口的命令0:iptables -I INPUT -s 192.168.0.232 -ptcp --dport 8501 - ...

  2. Java根据实体快速生成对象

    一.来源 在写代码时总是遇到下面这种情况: Account account = new Account(); account.setId(); account.setGmtCreate(); acco ...

  3. linux简单命令2---文件搜索命令

    1:文件搜索命令:locate 文件名搜索速度快,缺点不能复杂的搜索.在数据库(/var/lib/mlocate)查找.它是一天一更新.可以强制更新数据库:updatedb 2:搜索命令的命令:whe ...

  4. Oracle系统表整理+常用SQL语句收集(转载)

    原文:https://www.cnblogs.com/jiangxinnju/p/5840420.html-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是 ...

  5. 未能加载文件或程序集“System.Web.Extensions, Version=1.0.61025.0, Culture=neutral

    近日将电脑重装了一下,刚刚装上vs2005后打开以前的一个项目,居然出现了下面的错误: 未能加载文件或程序集“System.Web.Extensions.Design, Version=1.0.610 ...

  6. 【Leetcode_easy】682. Baseball Game

    problem 682. Baseball Game solution: 没想到使用vector! class Solution { public: int calPoints(vector<s ...

  7. Convex Hull | Set 1

    Given a set of points in the plane. the convex hull of the set is the smallest convex polygon that c ...

  8. Python扫描器-常用库-Request

    1.常用库-Request 1.1. 介绍 #安装:pip3 install requests #各种请求方式:常用的就是requests.get()和requests.post() >> ...

  9. Java基础教程:IDEA单元测试

    Java基础教程:IDEA单元测试 环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 安装JUnit插件步骤 File-->settings-->Plguins ...

  10. SMAP数据产品介绍与下载方法

    1 SMAP(Soil Moisture Active and Passive)数据介绍 SMAP baseline science data products在下面的表格中展示,这些数据产品可以从两 ...