1.同步容器类

它们是线程安全的

1.1 vector和hashtable。

和Collections.synchronizeXxx()一样。实现方式就是在每个方法里面加入synchronize代码块包着。加锁对象为当前对象

public int hashCode() {

         // ...

            synchronized (mutex) {return list.hashCode();}
} public E get(int index) {
synchronized (mutex) {return list.get(index);}
}
public E set(int index, E element) {
synchronized (mutex) {return list.set(index, element);}
}
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
} // ...

但对于复合操作,还是有风险。例如有两个线程分别执行:检查-获取元素,检查-删除元素。那么就会出现异常了。通常解决的方法是将检查-获取元素,检查-删除元素这样的操作进行synchronize代码块操作。而在遍历列表的情况下,通常可以考虑复制出一份元素在当前线程进行操作。防止其他线程修改元素导致ArrayIndexOutOfBoundException。

1.2 ConcurrentHashMap

它采用了和其他同步容器类不同的实现方式。一种粗粒度更细的锁:分段锁。concurrenthashmap的分段锁的方式带来了更高的性能,但是也权重放弃了一些东西。比如size。和isempty()。(concurrenthashmap需要单独篇幅介绍。暂时只介绍他对于并发的基础知识)。

public int size() {
long n = sumCount();
return ((n < 0L) ? 0 :
(n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE :
(int)n);
}
final long sumCount() {
CounterCell[] as = counterCells; CounterCell a;
long sum = baseCount;
if (as != null) {
for (int i = 0; i < as.length; ++i) {
if ((a = as[i]) != null)
sum += a.value;
}
}
return sum;
}

可以看出size并没有一个全局的量去给调用方获取。而是在每次调用的时候重新计算size,而size的counterCells是在每次修改元素后会进行修改该数组。也就是会带来size返回的可能是有偏差的值,这在高并发的操作中size的用处很小,因为他们的值总在变化。牺牲这些值来获取其他常用方法的更高性能。

总的来说:concurrentHashmap对比Collections.synchronizeHashmap和HashTable来说。一般情况下都优先使用concurrenthashmap。并发状况下具有更高的性能优势和更少的劣势。


最新文章

  1. 读书笔记--SQL必知必会01--了解SQL
  2. 循序渐进Python3(十一) --2-- web之javascript
  3. USACO Section 2.2: Preface Numbering
  4. C#插入排序详解
  5. 让delphi程序不受WINDOWS日期格式的影响
  6. day0
  7. hibernate_validator_09
  8. onethink权限管理 RBAC
  9. 接口测试培训:HTTP协议基础
  10. 201521123100 《Java程序设计》第5周学习总结
  11. VMWare 虚拟化 Ubuntu 64 (16.04)-- docker 无法链接 pull 镜像 ?(solved)
  12. 图像处理------颜色梯度变化 (Color Gradient)
  13. Linux目录架构详解
  14. 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)
  15. IoC之AutoFac(一)——简单使用和组件注册
  16. PYTHON-面向对象-练习-王者荣耀 对砍游戏
  17. Spring是如何处理注解的
  18. resize 按钮不会被伪元素遮盖
  19. BZOJ3162 独钓寒江雪(哈希+树形dp)
  20. 《jQuery基础教程》读书笔记

热门文章

  1. 【洛谷P1351】[NOIP2014]联合权值
  2. 【洛谷P1850】换教室[2016NOIP提高组]
  3. 【luogu P2984 [USACO10FEB]给巧克力Chocolate Giving】 题解
  4. SqlSugar之DbContext
  5. C语言输出格式
  6. 用c#语言编写分解质因数
  7. Dubbo源码分析之ExtensionLoader加载过程解析
  8. oracle删除一个表内的重复数据,
  9. 如何使用 SSL 证书配置端口
  10. js替换字符串中的空格,换行符\r\n或\n替换成&lt;br&gt;