3.JUC线程高级-同步容器 ConcurrentHashMap
Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。
- ConcurrentHashMap 同步容器类是Java5 增加的一个线程安全的哈希表。对于多线程的操作,介于HashMap与Hashtable之间。内部采用
锁分段
机制代替Hashtable 的独占锁
。进而提高性能。 - 此包还提供了设计用于多线程上下文中的Collection 实现:
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。 - 当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。
- 当期望的
读
数和遍历远远大于
列表的更新
数时,CopyOnWriteArrayList 优与同步的 ArrayList。
1. Hashtable 之所以效率低下的原因:
内部使用独占锁
机制,特别是遇到大量的复合操作
时效率就会很低。
2. ConcurrentHashMap 采用 锁分段
机制:
concurrentLevel分段级别,默认16段(segment)
这里每个分段都是一个独立的锁,这就意味着多个线程并发访问时并行执行,效率瞬间就高了。并且该类内部也提供了一些复合操作的方法。
在JDK1.8之后,jvm底层将ConcurrentHashMap底层的分段锁
转换为了 CAS(不会阻塞,不涉及上下文交互) 机制
3. CopyOnWrite 写入并复制
在此之前我们模拟并发修改异常情况:在遍历集合时为集合添加元素
package com.pyy.juc; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class TestCopyOnWriteArrayList { public static void main(String[] args) { HelloThread ht = new HelloThread(); for(int i = 0; i < 10; i++) { new Thread(ht).start(); } } } class HelloThread implements Runnable { private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); static { list.add("AA"); list.add("BB"); list.add("CC"); } @Override public void run() { Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); list.add("AA"); } } }
结果:报并发修改异常java.util.ConcurrentModificationException
java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851) at com.pyy.juc.HelloThread.run(TestCopyOnWriteArrayList.java:35) at java.lang.Thread.run(Thread.java:745)
如果遇到这样的操作我们可以使用 CopyOnWriteArrayList 并发容器类解决这问题:这个类的底层会在你执行写入之前先复制出一个新的列表再执行写入。
注意:
- 添加操作多时,效率低,因为每次添加都会进行复制,开销非常大。
- 适用于迭代(遍历操作)多,同时又考虑并发安全可以使用

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Polardb产品体验-智能家居篇 [魔咒]--阿里云 MVP分享
本文由阿里云 MVP 洵云提供。 Polardb 是阿里云研发的一种关系型数据库,与mysql完全兼容,而性能又是其6倍,具有高吞吐,低延迟等特性; 本测试通过模拟控制智能家居开关的终端场景,来体验polardb的性能; 1、环境搭建 1.1 polardb配置 首先需要购买polardb,按照处理器和内存的性能不同,价格也不同,最低的配置为2核4G的polar.mysql.x2.medium规格,包月价格560RMB; 购买以后,就可以通过连接https://polardb.console.aliyun.com/,进入polardb控制台进行相关的配置;选择一个地域节点[如华东1],创建一个实例,然后选择一个集群列表,创建一个集群。创建好后,可以看到数据库类型为POLARDB (MySQL 5.6),付费类型和到期时间分别为包月和一个月的长
- 下一篇
python-基于UDP通信的套接字,socketserver模块的使用
一、基于UDP协议通信的套接字 udp是没有链接的,所以先启动哪一端都不会报错 import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(('127.0.0.1',8082)) while True: data,client_addr=server.recvfrom(1024) print(data) server.sendto(data.upper(),client_addr) server.close() server import socket client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg=input('>>: ').strip() client.sendto(msg.encode('utf-8'),('127.0.0.1',8082)) data,server_addr=client.recvfrom(1024) print(data) client 由于udp无连接,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7