验证Hashmap不支持同步,ConcurrentHashMap支持

  1. 一直都不知道concurrenthashmap有什么实际的用处?先写个例子比较下hashmap和它。
  2. 方法用2000个线程下同一个key值,同步的话,应该最后的map的size为1,不同步可以大于1.
     Java Code 
    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
    29
    30
    31
     
    public  class HashMapSyn {
         public  static  void main( String[] args)  throws InterruptedException {
            System.out.println(runMapPutAndSizeShouldBe1( new HashMap< StringString>( 32)));
            System.out.println(runMapPutAndSizeShouldBe1( new ConcurrentHashMap< StringString>( 32)));
        }
        
         public  static  int runMapPutAndSizeShouldBe1( final Map< StringString> map)  throws InterruptedException {
            Thread t =  new Thread( new Runnable() {
                @Override
                 public  void run() {
                     for ( int i =  0; i <  2000; i++) {
                         new Thread( new Runnable() {
                            @Override
                             public  void run() {
                                map.put( "1""1");
                            }
                        },  "Thread inside " + i).start();
                    }
                }
            },  "Thread outside");
            t.start();
            t.join();
             return map.size();
        }

        @Test
         public  void testHashMapNotSynchronize()  throws InterruptedException {
            Assert.assertEquals( 1, runMapPutAndSizeShouldBe1( new ConcurrentHashMap< StringString>( 32)));
            Assert.assertNotSame( 1, runMapPutAndSizeShouldBe1( new HashMap< StringString>( 32)));
        }
    }
  3. 当然,hashmap的最后可能测不出来,可以将hashmap拷到本来加Thread.sleep。
     Java Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
         public V put(K key, V value) {
             if (key == null)
                 return putForNullKey(value);
             int hash = hash(key.hashCode());
             int i = indexFor(hash, table.length);
             for (Entry<K,V> e = table[i]; e != null; e = e.next) {
                Object k;
                 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                    V oldValue = e.value;
                    e.value = value;
                    e.recordAccess( this);
                     return oldValue;
                }
            }
            modCount++;
            
             /** add sleep for test*/
             try { Thread.sleep( 1); }  catch (InterruptedException e1) {}
            
            addEntry(hash, key, value, i);
             return null;
        }

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ConcurrentHashMapJava 并发库中的一种线程安全的哈希映射数据结构,它允许并发操作在多个线程间共享数据集而不会导致竞态条件或死锁。`ConcurrentHashMap` 提供了非常高的性能,并且适用于高并发环境。 关于允许键和值都为 `null` 的特性: 在 `ConcurrentHashMap` 中,键和值都可以是 `null`,这使得该数据结构非常适合某些应用场景。例如,在处理初始状态未知的数据、缓存系统中用于表示未找到对应实体的情况、或者是作为默认值提供给其他依赖于键或值存在的方法等场景下尤为有用。`null` 的存在可以简化程序设计,避免空指针异常的发生。 ### 实现细节 当将 `null` 作为键或值插入到 `ConcurrentHashMap` 中,会采用特殊的方式来处理。`null` 键和值的处理需要考虑到数据结构的内部实现,即它们如何在哈希表中定位并存储。`ConcurrentHashMap` 使用哈希桶数组和链表(在哈希冲突发生)或红黑树(在较高版本中,默认超过某个阈值)来管理键值对。对于 `null` 键或值,`ConcurrentHashMap` 可能会在初始化阶段就创建对应的条目,并将其放在特定位置,以避免后续的操作因为空指针引发错误。 ### 示例 下面是一个简单的例子,展示了如何使用 `ConcurrentHashMap` 来处理 `null` 键和值: ```java import java.util.concurrent.ConcurrentHashMap; public class Main { public static void main(String[] args) { ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); // 插入 null 键和值 map.put(null, "Hello"); // 插入非 null 键和值 map.put("World", null); System.out.println(map.get(null)); // 输出 "Hello" System.out.println(map.get("World")); // 输出 "null" // 删除 null 键 map.remove(null); System.out.println(map.size()); // 输出 "1" } } ``` 在这个示例中,我们首先尝试向 `ConcurrentHashMap` 添加一个 `null` 键配对 "Hello" 和一个 "World" 键配对 `null` 值。然后我们获取这两个条目的值来验证 `null` 键和值是否正常工作。最后,我们删除了 `null` 键对应的条目,并再次打印了集合的大小。 ### 相关问题 - **如何确定一个元素在 `ConcurrentHashMap` 中是否是 `null`?** 查看元素的键或值是否为 `null` 就可以直接判断。 - **为什么要在多线程环境中使用 `ConcurrentHashMap` 而不是普通 `HashMap` ?** `ConcurrentHashMap` 支持并发访问,减少了同步开销,更适合多线程环境下的读写操作。 - **在什么情况下可能会遇到与 `null` 键或值相关的异常?** 如果在操作 `null` 键或值,试图执行一个不支持 `null` 的操作(如 `equals()` 检查),可能会抛出异常。正确的做法是在使用前检查是否存在此类潜在的空指针异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值