博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合——ConcurrentHashMap
阅读量:4842 次
发布时间:2019-06-11

本文共 1239 字,大约阅读时间需要 4 分钟。

1、正确应用举例:

static Map<Integer,Integer> map = new ConcurrentHashMap();

// static Map<Integer,Integer> map = new HashMap();
  public static void main(String[] args) throws InterruptedException {
    ExecutorService service = Executors.newCachedThreadPool();
    for (int i = 0; i < 1000000; i++) {
      final int j = i;
      service.submit(new Runnable() {
        @Override
        public void run() {
          map.put(j, j);
        }
    });
  }
  Thread.sleep(1000);
  System.out.println(map.size());
  service.shutdown();
  }

put 时候 ConcurrentHashMap 的put方法加锁了,所以插入1000000数据不会出现丢失情况;

HashMap会出现数据丢失。原因:假如2个线程同时put , 且 “key” 对应的底层数组位置相同(hash冲突),其中一个线程可能会覆盖另一个线程put的值;

 

2、错误应用

  static Map<Object, Object> map = new ConcurrentHashMap<>();

  public static void main(String[] args) throws Exception {
    new Thread(){
      @Override
      public void run() {TestMap.add();}};
      new Thread(){
      @Override
      public void run() {TestMap.add();}};
  }
  static void add(){
    if(map.get("num")==null) map.put("num", "0");
    for(int i=0;i<1000;i++){
    int num = (int)map.get("num");
    map.put("num", num+1);
  }

这里并不能得到想要的结果(2000),虽然put方法加了锁,但是 这里的 add() 方法并不是原子性的

转载于:https://www.cnblogs.com/leiyongsbokeyuan/p/8418634.html

你可能感兴趣的文章
学习WPF之 Binding
查看>>
Windows7系统下Oracle数据库安装的oracle net configuration assistant失败问题
查看>>
umeditor 踩坑
查看>>
luogu P1854 花店橱窗布置
查看>>
6-6 小球下落 uva679
查看>>
Victor and World 状压dp
查看>>
vim 常用设置
查看>>
NGUI所见即所得之UIAtlasMaker , UIAtlas (2)
查看>>
Dynamics AX 2012 R2 耗尽用户
查看>>
项目引入非配置的文件,打成war包后测试报错的可能原因
查看>>
ubuntu更改apache2根目录
查看>>
Hibernate配置属性
查看>>
hibernate.properties
查看>>
那些可能被你忽略的MySQL优化技巧
查看>>
bzoj1034: [ZJOI2008]泡泡堂BNB
查看>>
Android Studio快捷键每日一练(2)
查看>>
atoi函数实现
查看>>
文本文件和二进制文件
查看>>
WCF 实例 —— Android 短信助手 (WCF + Android)
查看>>
C# 读写opc ua服务器,浏览所有节点,读写节点,读历史数据,调用方法,订阅,批量订阅操作...
查看>>