zoukankan      html  css  js  c++  java
  • ConcurrentHashMap 中putIfAbsent 和put的区别

    putIfAbsent 源代码

        public V putIfAbsent(K key, V value) {
            Segment<K,V> s;
            if (value == null)
                throw new NullPointerException();
            int hash = hash(key);
            int j = (hash >>> segmentShift) & segmentMask;
            if ((s = (Segment<K,V>)UNSAFE.getObject
                 (segments, (j << SSHIFT) + SBASE)) == null)
                s = ensureSegment(j);
            return s.put(key, hash, value, true);
        }
    

    put源代码

      public V put(K key, V value) {
            Segment<K,V> s;
            if (value == null)
                throw new NullPointerException();
            int hash = hash(key);
            int j = (hash >>> segmentShift) & segmentMask;
            if ((s = (Segment<K,V>)UNSAFE.getObject          // nonvolatile; recheck
                 (segments, (j << SSHIFT) + SBASE)) == null) //  in ensureSegment
                s = ensureSegment(j);
            return s.put(key, hash, value, false);
        }
    

      前面一段都是一样的,都是先计算hash再同步取值,区别在于 

    s.put(key, hash, value, true); 和
    return s.put(key, hash, value, false);

    final V put(K key, int hash, V value, boolean onlyIfAbsent) {
    

      

    for (HashEntry<K,V> e = first;;) {
                        if (e != null) {
                            K k;
                            if ((k = e.key) == key ||
                                (e.hash == hash && key.equals(k))) {
                                oldValue = e.value;
                                if (!onlyIfAbsent) {
                                    e.value = value; //putIfAbsent下不会进入修改e.value, 在key已经存在的情况下
    ++modCount; } break; } e = e.next; }

      

    onlyIfAbsent 参数,如果key存在的情况下,在putIfAbsent下不会修改,而put下则会修改成新的值
    测试put
    		ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
    		System.out.println(map.put("1", "1"));
    		System.out.println(map.put("1", "2"));
    		System.out.println(map.get("1"));
    

      结果为:

    null
    1
    2

    测试putIfAbsent
    	ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
    	System.out.println(map.putIfAbsent("1", "1"));
    	System.out.println(map.putIfAbsent("1", "2"));
    	System.out.println(map.get("1"));
    

     结果为:

    null
    1
    1

  • 相关阅读:
    AngularJS数据建模(转载)
    Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
    EF开发程序经常用的几个东西
    jQuery插件---轻量级的弹出窗口wBox
    SQL Server 索引维护sql语句
    windows server2008 r2 下启用 sqlserver 2008的远程连接
    windows2012 r2 提高网速方法
    jQuery validation
    Bootstrap Modal 垂直居中
    shell 循环读取文件及字符串转为数组
  • 原文地址:https://www.cnblogs.com/chengxin1982/p/6489672.html
Copyright © 2011-2022 走看看