并发容器线程安全应对之道

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

2 并发容器线程安全应对之道
  1. 引言
  2. 在前面,我们学习了hashmap
  3. 大家都知道HashMap不是线程安全(put、删除、修改、递增、扩容都无锁)的
  4. 所以在处理并发的时候会出现问题
  5. 接下来我们看下J.U.C包里面提供的一个线程安全并且高效Map(ConcurrentHashMap)
  6. 看一下,他到底是如何实现线程并发安全的
复制代码
2.1 并发容器总体概述

目标:学习ConcurrentHashMap基本概念和认识它的数据结构
ConcurrentHashMap概念:
ConcurrentHashMap是J.U.C包里面提供的一个线程安全的HashMap, 在并发编程中使用的频率(Spring)比较高。
数据结构如下
数组+链表+红黑树+锁(synchronized+cas

总结:
1、数据结构和hashmap一模一样,唯一的区别就是concurrenthashmap在put、删除、修改、递增、扩容和数据迁移的时候都加锁了(syn  or  cas)
2、加锁只是锁住一个元素,区别于HashTable(整个表,idea可以查看源码来验证)
2.2 并发容器数据结构与继承

目标:
简单认识下ConcurrentHashMap继承关系

总结
ConcurrentHashMap:实现Serializable表示支持序列化
​                                         继承AbstractMap(实现map接口),实现了一些基本操作
​                                         实现ConcurrentMap接口,封装了map的基本操作
2.3 并发容器源码深度剖析

测试代码
  1. 见put部分
复制代码
2.3.1 并发容器成员变量

目标:认识下ConcurrentHashMap成员变量,先有个印象,方便后续源码分析
  1. private static final int MAXIMUM_CAPACITY = 1 << 30; //table最大容量:2^30=1073741824
  2. private static final int DEFAULT_CAPACITY = 16; //默认容量,必须是2的幂数
  3. static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; ////数组的建议最大值
  4. private static final int DEFAULT_CONCURRENCY_LEVEL = 16; //并发级别,1.8前的版本分段锁遗留下来的,为兼容以前的版本
  5. static final int TREEIFY_THRESHOLD = 8;// 链表转红黑树阀值
  6. static final int UNTREEIFY_THRESHOLD = 6;// 树转链表阀值
  7. static final int MIN_TREEIFY_CAPACITY = 64;// 转化为红黑树的表的最小容量
  8. private static final int MIN_TRANSFER_STRIDE = 16;// 每次进行转移的最小值
  9. //咦?threshold 呢???
复制代码
总结:该构造函数用于创建一个带有指定初始容量的map

<strong>3、ConcurrentHashMap(Map

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表