`

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

    博客分类:
  • Java
阅读更多
  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;
        }

     

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics