1.背景

集合类中的map,大家一定熟悉,知道它非线程安全。使用的方法有两种,一种是在map上加同步器(锁),另一种是创建容器时使用Collections中的静态方法对map进行包装。

java api 中的例子:

 1   Map m = Collections.synchronizedMap(new HashMap());
2 ...
3 Set s = m.keySet(); // Needn't be in synchronized block
4 ...
5 synchronized (m) { // Synchronizing on m, not s!
6 Iterator i = s.iterator(); // Must be in synchronized block
7 while (i.hasNext())
8 foo(i.next());
9 }
10

2.疑问

到这里大家可能会有疑问。

第一,既然已经进行了包装,为什么返回的是线程安全的包装类,里面是如何实现的?

第二,这个类是线程安全的,接下来的iterator的使用为什么需要用户进行同步化呢?

我们看Collections.synchronizedMap的源码,

 1         。。。
2 public <T> T[] toArray(T[] a) {
3 synchronized (mutex) {return c.toArray(a);}
4 }
5
6 public Iterator<E> iterator() {
7 return c.iterator(); // Must be manually synched by user!
8 }
9
10 public boolean add(E e) {
11 synchronized (mutex) {return c.add(e);}
12 }
13 public boolean remove(Object o) {
14 synchronized (mutex) {return c.remove(o);}
15 }
16 。。。

对于第一个问题,

大部分方法中都已经用synchronized关键字进行修饰了,因此保证了线程安全性。

对于第二个问题,

源码中未进行同步化,需要用户自己对 iterator的调用以及hasNext和Next 进行同步化。HasNext和next方法的调用,源码控制不了,所以用户自己做同步话操作。

个人理解,有不对的地方,望大家指正,共同探讨。

最新文章

  1. JS二维数组排序组合
  2. C++_系列自学课程_第_3_课_变量和基本类型_《C++ Primer 第四版》
  3. springMVC配置Json
  4. [BI项目记]-搭建代码管理环境之服务端
  5. iOS 键盘类型定制归纳
  6. 关于tomcat8在windows2008下高并发下问题的解决方案
  7. Oracle 数据类型映射C#
  8. Qt 学习之路:输入元素
  9. Delphi TNativeXML Node节点乱码的一种解决方法
  10. FORM表单不刷新提交POST数据
  11. PHP连接和拆分数组array_combine()和array_slice()用法示例
  12. 翻译:Identifier Name标识符命名规则
  13. Jmeter3.1 使用技巧
  14. zzcms8.2#任意用户密码重置#del.php时间盲注#复现
  15. python错误和异常
  16. 货币转换 I
  17. JavaScript的使用你知道几种?(上)
  18. 【亲测】502 Bad Gateway 怎么解决?
  19. LINUX配置过程记录
  20. urllib和requests库

热门文章

  1. [原题复现][CISCN 2019 初赛]WEB-Love Math(无参数RCE)[未完结]
  2. 金九银十想面BAT?那这些JDK 动态代理的面试点你一定要知道
  3. 新鲜出炉!阿里Java后端面经,已拿offer!
  4. 又陷入知识盲区了,面试被问SpringBoot集成dubbo,我当时就懵了
  5. 新鲜出炉!两万月薪的Java工程师面试题,看看你能做出来多少?
  6. 怎么用在线思维导图Ayoa规划个人任务
  7. Mac虚拟环境安装django
  8. Netty源码分析之ByteBuf(二)—内存分配器ByteBufAllocator
  9. 【ACwing 96】奇怪的汉诺塔——区间dp
  10. 16_Android的数据存储_ SharedPreference、XML和JSON