- 一直都不知道concurrenthashmap有什么实际的用处?先写个例子比较下hashmap和它。
- 方法用2000个线程下同一个key值,同步的话,应该最后的map的size为1,不同步可以大于1. Java Code
public class HashMapSyn {
public static void main( String[] args) throws InterruptedException {
System.out.println(runMapPutAndSizeShouldBe1( new HashMap< String, String>( 32)));
System.out.println(runMapPutAndSizeShouldBe1( new ConcurrentHashMap< String, String>( 32)));
}
public static int runMapPutAndSizeShouldBe1( final Map< String, String> 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< String, String>( 32)));
Assert.assertNotSame( 1, runMapPutAndSizeShouldBe1( new HashMap< String, String>( 32)));
}
}
- 当然,hashmap的最后可能测不出来,可以将hashmap拷到本来加Thread.sleep。 Java Code
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;
}