网站编辑制作,wordpress 微博链接,假网站怎么做,沈阳网站制作列表网目录 什么是ConcurrentHashMap#xff1f;为什么有ConcurrentHashMap#xff1f;和HashMap区别示例代码对比 JDK7和JDK8中ConcurrentHashMap整体架构的区别JDK7中JDK8中 ConcurrentHashMap的基本功能在性能方面的优化使用到的技术-CAS概念说明比较并交换的过程如下#xff1… 目录 什么是ConcurrentHashMap为什么有ConcurrentHashMap和HashMap区别示例代码对比 JDK7和JDK8中ConcurrentHashMap整体架构的区别JDK7中JDK8中 ConcurrentHashMap的基本功能在性能方面的优化使用到的技术-CAS概念说明比较并交换的过程如下举例说明底层原理代码演示 总结 什么是ConcurrentHashMap ConcurrentHashMapConcurrent并存的同时发生的 ConcurrentHashMap是Java中的一个线程安全的哈希表实现它可以在多线程环境下高效地进行并发操作。
为什么有ConcurrentHashMap HashMap线程不安全在多线程操作下可能会导致数据错乱
和HashMap区别 示例代码对比 使用HashMap和ConcurrentHashMap分别实现以下需求。 用30个线程向实例化出的map中插入keyvalue。每一次插入后把map打印出来for循环中sout key为for循环中的i值 value使用UUID
public class HashMapUnsafeTest {public static void main(String[] args) throws InterruptedException {//演示HashMapMapString, String map new HashMap();for (int i 0; i 30; i) {String key String.valueOf(i);new Thread(() - {//向集合添加内容map.put(key, UUID.randomUUID().toString().substring(0, 8));//从集合中获取内容System.out.println(map);}, ).start();}}
}public class ConcurrentHashMapSafe {public static void main(String[] args) throws InterruptedException {//演示ConcurrentHashMapMapString, String map new ConcurrentHashMap();for (int i 0; i 30; i) {String key String.valueOf(i);new Thread(() - {//向集合添加内容map.put(key, UUID.randomUUID().toString().substring(0, 8));//从集合中获取内容System.out.println(map);}, ).start();}}
}多个线程同时对同一个集合进行增删操作导致错误 JDK7和JDK8中ConcurrentHashMap整体架构的区别
JDK7中 JDK8中 使用到的数据结构数组、单向链表、红黑树
其中涉及到几个核心的参数
// 最大容量2^30
private static final int MAXIMUM_CAPACITY 1 30;
// 默认长度
private static final int DEFAULT_CAPACITY 16;//遗留问题为什么树化条件是8而取消树化条件却是6呢
// 链表树化条件-是根据线程竞争情况和红黑树的操作成本进行设计的。
static final int TREEIFY_THRESHOLD 8;
// 取消树化条件-为了避免过度的树化防止内存占用过高。
static final int UNTREEIFY_THRESHOLD 6; //链表结构中每个节点只需要存储指向下一个节点的指针而不需要存储节点的值。因此链表只需要存储节点的引用占用较少的内存空间。树结构中每个节点需要存储节点的值以及指向子节点的指针。核心为Hash表存在Hash冲突问题 使用链式存储方式解决冲突冲突较多时导致链表过长查询效率较低在JDK1.8中引入红黑树机制 当数组长度大于64且链表长度大于等于8时单项链表转为红黑树 当链表长度小于6时红黑树会退化为单向链表
ConcurrentHashMap的基本功能 本质上是一个HashMap功能和HashMap是一样的 但ConcurrentHashMap在HashMap基础上提供了并发安全的实现主要通过对node节点加锁实现来保证对数据更新的安全性 锁粒度变小
在性能方面的优化 在JDK1.8中锁的粒度是数组中的某一个节点在JDK1.7中锁定的是一个Segment锁的范围更大 保证线程安全机制 JDK7采用segment的分段锁机制实现线程安全其中segment继承自ReentrantLock。 JDK8采用CAS(读)Synchronized(写)保证线程安全。 锁的粒度原来是对需要进行数据操作的Segment加锁JDK8调整为对每个数组元素加锁Node。 链表转化为红黑树定位结点的hash算法简化会带来弊端Hash冲突加剧因此在链表节点数量大于8时会将链表转化为红黑树进行存储。
使用到的技术-CAS
概念说明
CAS的全称是比较并交换Compare And Swap。在CAS中有这样三个值 V要更新的变量(var) E预期值(expected) N新值(new)
比较并交换的过程如下 判断V是否等于E如果等于将V的值设置为N如果不等说明已经有其它线程更新了V则当前线程放弃更新什么都不做。
举例说明 如果有一个多个线程共享的变量i原本等于5我现在在线程A中想把它设置为新的值6; 我们使用CAS来做这个事情 首先我们用i去与5对比发现它等于5说明没有被其它线程改过那我就把它设置为新的值6此次CAS成功i的值被设置成了6 如果不等于5说明i被其它线程改过了比如现在i的值为2那么我就什么也不做此次CAS失败i的值仍然为2。
底层原理 unsafe类——以下是类中涉及到的三个方法用来实现CAS效果的这三个方法都是由native进行修饰的。具体的实现是由C写的。
代码演示
没有使用CAS的代码
package com.example.threadpool.CAS;public class NoCASDemo {private static int counter 0;public static void main(String[] args) throws InterruptedException {//线程一Thread thread1 new Thread(() - {for (int i0; i10000;i){counter;}});//线程二Thread thread2 new Thread(() - {for (int i0; i10000;i){counter;}});//执行线程thread1.start();thread2.start();//等待执行完线程1和2thread1.join();thread2.join();System.out.println(查看counter的总数counter);}}使用CAS的代码
package com.example.threadpool.CAS;import java.util.concurrent.atomic.AtomicInteger;public class CASDemo {private static AtomicInteger counter new AtomicInteger(0);public static void main(String[] args) throws InterruptedException {//线程一Thread thread1 new Thread(() - {for (int i0; i10000;i){increment();}});//线程二Thread thread2 new Thread(() - {for (int i0; i10000;i){increment();}});//执行线程thread1.start();thread2.start();//等待执行完线程1和2thread1.join();thread2.join();System.out.println(查看counter的总数counter.get());}public static void increment() {int currentValue;int newValue;do {//获取counter对象的value值currentValue counter.get();//将counter对象的value值加1newValue currentValue 1;} while (!counter.compareAndSet(currentValue, newValue));}}总结 总的来说ConcurrentHashMap是Java中线程安全的哈希表实现它通过使用锁分段技术来提供高效的并发性能。相比于HashtableConcurrentHashMap在多线程环境下能够更好地支持高并发读写操作。 使用ConcurrentHashMap可以在多线程环境下安全地进行数据操作而无需手动加锁。它通过将整个数据结构分成多个段来实现并发性能的提升不同的线程可以同时访问不同的段从而减少了线程之间的竞争。 ConcurrentHashMap的设计考虑了线程安全和性能的平衡。它提供了一些有用的方法如putIfAbsent()、replace()等可以方便地进行原子性的操作。此外ConcurrentHashMap还支持遍历操作可以通过迭代器安全地遍历其中的元素。 需要注意的是虽然ConcurrentHashMap是线程安全的但并不保证对于单个操作的原子性。如果需要进行复合操作仍然需要额外的同步措施。 总的来说ConcurrentHashMap是一个强大的线程安全的哈希表实现适用于多线程环境下的高并发读写操作。它提供了高效的并发性能可以提升系统的吞吐量和响应速度。 文章转载自: http://www.morning.yqrgq.cn.gov.cn.yqrgq.cn http://www.morning.bby45.cn.gov.cn.bby45.cn http://www.morning.twgzq.cn.gov.cn.twgzq.cn http://www.morning.xpzkr.cn.gov.cn.xpzkr.cn http://www.morning.htpjl.cn.gov.cn.htpjl.cn http://www.morning.ltkms.cn.gov.cn.ltkms.cn http://www.morning.c7512.cn.gov.cn.c7512.cn http://www.morning.gtqws.cn.gov.cn.gtqws.cn http://www.morning.gkgb.cn.gov.cn.gkgb.cn http://www.morning.pswqx.cn.gov.cn.pswqx.cn http://www.morning.kphsp.cn.gov.cn.kphsp.cn http://www.morning.bqmsm.cn.gov.cn.bqmsm.cn http://www.morning.jrslj.cn.gov.cn.jrslj.cn http://www.morning.wsyq.cn.gov.cn.wsyq.cn http://www.morning.qsy37.cn.gov.cn.qsy37.cn http://www.morning.jrplk.cn.gov.cn.jrplk.cn http://www.morning.wdqhg.cn.gov.cn.wdqhg.cn http://www.morning.lltdf.cn.gov.cn.lltdf.cn http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn http://www.morning.pyncm.cn.gov.cn.pyncm.cn http://www.morning.jxhlx.cn.gov.cn.jxhlx.cn http://www.morning.wnrcj.cn.gov.cn.wnrcj.cn http://www.morning.jzxqj.cn.gov.cn.jzxqj.cn http://www.morning.wjpsn.cn.gov.cn.wjpsn.cn http://www.morning.kqpq.cn.gov.cn.kqpq.cn http://www.morning.xgjhy.cn.gov.cn.xgjhy.cn http://www.morning.jrrqs.cn.gov.cn.jrrqs.cn http://www.morning.tzcr.cn.gov.cn.tzcr.cn http://www.morning.clbzy.cn.gov.cn.clbzy.cn http://www.morning.gfprf.cn.gov.cn.gfprf.cn http://www.morning.gzzncl.cn.gov.cn.gzzncl.cn http://www.morning.ybhrb.cn.gov.cn.ybhrb.cn http://www.morning.smyxl.cn.gov.cn.smyxl.cn http://www.morning.tfzjl.cn.gov.cn.tfzjl.cn http://www.morning.tldhq.cn.gov.cn.tldhq.cn http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.bhwz.cn.gov.cn.bhwz.cn http://www.morning.gwkwt.cn.gov.cn.gwkwt.cn http://www.morning.wyppp.cn.gov.cn.wyppp.cn http://www.morning.gftnx.cn.gov.cn.gftnx.cn http://www.morning.krxzl.cn.gov.cn.krxzl.cn http://www.morning.rgxn.cn.gov.cn.rgxn.cn http://www.morning.ykwbx.cn.gov.cn.ykwbx.cn http://www.morning.jghty.cn.gov.cn.jghty.cn http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.kqfdrqb.cn.gov.cn.kqfdrqb.cn http://www.morning.jrslj.cn.gov.cn.jrslj.cn http://www.morning.bksbx.cn.gov.cn.bksbx.cn http://www.morning.mrpqg.cn.gov.cn.mrpqg.cn http://www.morning.nlmm.cn.gov.cn.nlmm.cn http://www.morning.wyrsn.cn.gov.cn.wyrsn.cn http://www.morning.rwnx.cn.gov.cn.rwnx.cn http://www.morning.kwrzg.cn.gov.cn.kwrzg.cn http://www.morning.tslxr.cn.gov.cn.tslxr.cn http://www.morning.clbsd.cn.gov.cn.clbsd.cn http://www.morning.qllcp.cn.gov.cn.qllcp.cn http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.kqnwy.cn.gov.cn.kqnwy.cn http://www.morning.xxgfl.cn.gov.cn.xxgfl.cn http://www.morning.rfqkx.cn.gov.cn.rfqkx.cn http://www.morning.wtcd.cn.gov.cn.wtcd.cn http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.mjbjq.cn.gov.cn.mjbjq.cn http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn http://www.morning.grpbt.cn.gov.cn.grpbt.cn http://www.morning.vehna.com.gov.cn.vehna.com http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn http://www.morning.dfckx.cn.gov.cn.dfckx.cn http://www.morning.rfpb.cn.gov.cn.rfpb.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.cctgww.cn.gov.cn.cctgww.cn http://www.morning.lpsjs.com.gov.cn.lpsjs.com http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.nlkm.cn.gov.cn.nlkm.cn http://www.morning.ptlwt.cn.gov.cn.ptlwt.cn http://www.morning.jbctp.cn.gov.cn.jbctp.cn http://www.morning.zfhzx.cn.gov.cn.zfhzx.cn http://www.morning.qstjr.cn.gov.cn.qstjr.cn http://www.morning.mlwhd.cn.gov.cn.mlwhd.cn