zoukankan      html  css  js  c++  java
  • Concurrent实现原理

    ConcurrentHashMap和HashTable类似,但加锁方式不同

    HashTable是锁住整个map

    ConcurrentHashMap的基本思想是采取分块的方式加锁,分块数由参数“concurrencyLevel”来决定(和HashMap中的“initialCapacity”类似,实际块数是第一个大于concurrencyLevel的2的n次方)。每个分块被称为Segment,Segment的索引方式和HashMap中的Entry索引方式一致(hash值对数组长度取模)。

    对Segment加锁的方式很简单,直接把Segment定义为ReentrantLock的子类。

    static final class Segment<K,V> extends ReentranceLock implements Seriable{}

    Segmentk可以看出一个特定实现的HashTable

    sieze():

      Segment里的全局变量count是一个volatile变量,在累加count操作过程中,之前累加过的count发生变化的几率非常小,所以ConcurrentHashMap的做法是先尝试2次通过不锁住Segment的方式来统计各个Segment大小,如果统计的过程中,容器的count发生了变化,则再采用加锁的方式来统计所有Segment的大小

      ConcurrentHashMap通过modCount变量判断容器是否发生变化,在put , remove和clean方法里操作元素前都会将变量modCount进行加1,那么在统计size前后比较modCount是否发生变化,从而得知容器的大小是否发生变化

  • 相关阅读:
    iptables操作指令
    最怕问初衷,大梦成空
    kettle官网wiki
    Pentaho Spoon (Kettle) 出现 Timestamp :Unable to get timestamp from resultset at index 30 错误的解决
    win10安装vs2013失败解决方法
    2020 最新 kail 安装教程
    01_docker学习笔记(一)
    数据结构的基础概念
    BOS3
    配置文件添加druid控制台
  • 原文地址:https://www.cnblogs.com/zawjdbb/p/7256071.html
Copyright © 2011-2022 走看看