西北野狼
我的github: https://github.com/soyoungboy
我的segmentfault: http://segmentfault.com/u/soyoungboy
【不积跬步,无以至千里;不积小流,无以成江海】
博客园 首页 新随笔 联系 订阅
管理 随笔-477 评论-20 文章-0
【推荐】微信小程序一站式部署 多场景模板定制
最新IT新闻:
· 你逛的这些地方,可能都是腾讯的地盘
· 你已经习惯了的这些衣食住行,其实都是阿里的地盘
· 华为云总裁郑叶来:公有云竞争远未结束 AI被过度消费
· 扎克伯格纪念FB诞生14周年:你们想到的错误 我都犯过
· A站凉了,百万“猴子”无家可归
» 更多新闻...
最新知识库文章:
· 领域驱动设计在互联网业务开发中的实践
· 步入云计算
· 以操作系统的角度述说线程与进程
· 软件测试转型之路
· 门内门外看招聘
» 更多知识库文章... 昵称:西北野狼
园龄:4年6个月
粉丝: 34
关注: 3 +加关注
我的github: https://github.com/soyoungboy
我的segmentfault: http://segmentfault.com/u/soyoungboy
【不积跬步,无以至千里;不积小流,无以成江海】
博客园 首页 新随笔 联系 订阅
java多线程 -- ConcurrentHashMap 锁分段 机制
hashtable效率低ConcurrentHashMap 线程安全,效率高
Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能。
- ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表。对 与多线程的操作,介于 HashMap 与 Hashtable 之间。内部采用“锁分段”机制替代 Hashtable 的独占锁。进而提高性能。
- 此包还提供了设计用于多线程上下文中的 Collection 实现:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。当期望许多线程访问一个给 定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。当期望的读数和遍历远远 大于列表的更新数时,CopyOnWriteArrayList 优于同步的 ArrayList。
关于锁分段机制:
HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术。首先将数据分成一段一段地存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问
Segment是一种可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据;
--引自 《java并发编程的艺术》
ConcurrentHashMap 和HashMap方法基本上保持一致。
当多线程访问并处理List的时候会出现并发修改异常:
Exception in thread "Thread-8" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.company.HelloThread.run(TestCopyOnWriteArrayList.java:42)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-7" Exception in thread "Thread-9" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.company.HelloThread.run(TestCopyOnWriteArrayList.java:42)
at java.lang.Thread.run(Thread.java:745)
出现这种情况demo:
package com.company;
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("小王");
list.add("中王");
list.add("大王");
}
@Override
public void run() {
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
list.add("==");
}
}
}
那么如果避免多线程下这种问题的产生呢,利用CopyOnWriteArrayList :
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
/*
* CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制”
* 注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大。并发迭代操作多时可以选择。
*/
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>());
private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
static {
list.add("大王A");
list.add("大王B");
list.add("大王C");
}
@Override
public void run() {
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
list.add("====");
}
}
}
结果:
大王A
大王A
大王A
大王B
大王A
大王B
大王A
大王B
大王C
大王A
大王A
大王B
大王C
====
大王C
大王B
大王B
大王C
====
大王A
大王C
====
大王A
====
====
大王B
大王C
====
大王B
大王A
====
大王C
====
====
====
大王B
大王C
====
====
大王B
====
====
====
====
大王C
====
====
====
====
====
大王C
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
posted on 2017-03-28 21:54 西北野狼 阅读(126) 评论(0) 编辑 收藏 刷新评论刷新页面返回顶部 注册用户登录后才能发表评论,请 登录 或 注册, 访问网站首页。 【推荐】超50万VC++源码: 大型工控、组态\仿真、建模CAD源码2018!
【推荐】微信小程序一站式部署 多场景模板定制
· 你逛的这些地方,可能都是腾讯的地盘
· 你已经习惯了的这些衣食住行,其实都是阿里的地盘
· 华为云总裁郑叶来:公有云竞争远未结束 AI被过度消费
· 扎克伯格纪念FB诞生14周年:你们想到的错误 我都犯过
· A站凉了,百万“猴子”无家可归
» 更多新闻...
· 领域驱动设计在互联网业务开发中的实践
· 步入云计算
· 以操作系统的角度述说线程与进程
· 软件测试转型之路
· 门内门外看招聘
» 更多知识库文章... 昵称:西北野狼
园龄:4年6个月
粉丝: 34
关注: 3 +加关注
|
||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
|---|---|---|---|---|---|---|
| 28 | 29 | 30 | 31 | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
搜索
常用链接
我的标签
- android 5.0(16)
- ormlite(3)
- AndroidGradle(2)
- java复习(2)
- swift object c学习(1)
- Swift or Object c(1)
随笔分类
- 【android 面试】(12)
- 【android】(194)
- 【android--bug】(33)
- 【android--openGL】(1)
- 【androidstudio--学习和使用经验】(2)
- 【android--Thread--线程池的使用】(1)
- 【android--性能优化】(19)
- 【App研发录读书笔记】(6)
- 【Effactive Java】(2)
- 【Eventbus】(7)
- 【Gradle学习】
- 【html5】(6)
- 【IOS】(3)
- 【J2EE】(22)
- 【J2EE面试题】(2)
- 【Java -- JDBC 学习】(12)
- 【java 1.8 新特性学习】
- 【Java NIO -- IO高级进阶】(7)
- 【java 基础复习】(5)
- 【JavaWeb】(2)
- 【java多线程 -- 高级进阶】(10)
- 【JDK源码学习】(2)
- 【json异常】(2)
- 【maven学习】(4)
- 【MySQL】(1)
- 【phoneGap学习】(1)
- 【python 学习】(11)
- 【Rxjava学习】(1)
- 【Servlet】(2)
- 【shell脚本学习】
- 【sqlite高级进阶】(1)
- 【Volley学习和源码分析】(7)
- 【Web前端 -- JavaScript 学习和复习】(8)
- 【Web前端--Html&Css学习复习】(39)
- 【产品知识学习】
- 【计划】(1)
- 【设计模式复习】(26)
- 【深入理解java虚拟机】(2)
- 【数据结构与算法】(6)
- 【移动支付】(3)
- 【重构-改善既有代码的设计】
- 【自定义控件】(7)
随笔档案
- 2017年11月 (3)
- 2017年10月 (8)
- 2017年9月 (9)
- 2017年8月 (11)
- 2017年7月 (4)
- 2017年6月 (26)
- 2017年5月 (22)
- 2017年4月 (40)
- 2017年3月 (18)
- 2017年2月 (11)
- 2017年1月 (9)
- 2016年9月 (5)
- 2016年8月 (6)
- 2016年7月 (2)
- 2016年6月 (4)
- 2016年5月 (7)
- 2016年4月 (8)
- 2016年3月 (2)
- 2016年2月 (2)
- 2016年1月 (2)
- 2015年12月 (6)
- 2015年11月 (10)
- 2015年10月 (10)
- 2015年9月 (11)
- 2015年8月 (5)
- 2015年7月 (13)
- 2015年6月 (6)
- 2015年5月 (17)
- 2015年4月 (10)
- 2015年3月 (6)
- 2015年2月 (4)
- 2015年1月 (19)
- 2014年12月 (15)
- 2014年11月 (11)
- 2014年10月 (1)
- 2014年9月 (2)
- 2014年8月 (4)
- 2014年7月 (2)
- 2014年6月 (2)
- 2014年5月 (17)
- 2014年4月 (11)
- 2014年3月 (6)
- 2014年2月 (4)
- 2014年1月 (17)
- 2013年12月 (38)
- 2013年11月 (21)
- 2013年10月 (2)
- 2013年9月 (1)
- 2013年8月 (7)
My github
我的个人博客站点
积分与排名
- 积分 - 110533
- 排名 - 2676
最新评论
- 1. Re:J2EE--常见面试题总结 -- 一
- mark
- --Jason928
- 2. Re:LinkedHashMap 源码解析
- @稻花谢谢,也欢迎多多指点和建议...
- --西北野狼
- 3. Re:LinkedHashMap 源码解析
- 非常不错
- --稻花
- 4. Re:项目实战之集成邮件开发
- 不错!
- --天边里
- 5. Re:Spring -- AOP
- @BillySir通过 ProceedingJoinPoint 或者JoinPoint...
- --西北野狼
阅读排行榜
- 1. Glide加载圆形图片(13832)
- 2. androidstudio--gsonformat--超爽的数据解析方式(9863)
- 3. android app 集成 支付宝支付 微信支付(6304)
- 4. 项目中处理android 6.0权限管理问题(4390)
- 5. Activity生命周期方法调用finish后的不同表现(4353)
评论排行榜
- 1. material design 的android开源代码整理(4)
- 2. Spring -- AOP(2)
- 3. 如何在使用eclipse的情况下,清理android项目中的冗余class文件和资源文件以及冗余图片(2)
- 4. android使用shape做selector按钮按下和弹起的动画(2)
- 5. java泛型操作复习,以及讲解在android中使用的场景(2)
推荐排行榜
- 1. material design 的android开源代码整理(8)
- 2. 某技术大牛的帖子(android项目总结)(1)
- 3. android经典开源代码集合(1)
- 4. android -- 加载gif 防止oom(1)
- 5. android 实现透明状态栏(1)