思路:通过多个线程向同一个HashMap或HashTable插入一个key值完全相同的key值,最后在线程都执行完后打印HashMap或HashTable的大小.size
1.正确结果应该是:只有 大小输出为 1
2.HashMap和HashTable 的执行结果
①hashTable
②HashMap
所以说 HashTable 是线程安全
HashMap不安全
代码
package com.xzit.map;
import java.util.HashMap;
import java.util.concurrent.CountDownLatch;
public class TestHashMap {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(10000);
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
ThreadMap1 threadMap1 = new ThreadMap1();
threadMap1.setHashMap(hashMap);
threadMap1.setCountDownLatch(countDownLatch);
for (int i = 0; i < 10000; i++) {
//启动10个线程
new Thread(threadMap1,"线程"+i).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(hashMap.size());
}
}
class ThreadMap1 implements Runnable {
HashMap<String, Integer> hashMap;
CountDownLatch countDownLatch;
public void setCountDownLatch(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void setHashMap(HashMap<String, Integer> hashMap) {
this.hashMap = hashMap;
}
@Override
public void run() {
hashMap.put("dd", 1);
countDownLatch.countDown();
}
}
package com.xzit.map;
import java.util.Hashtable;
import java.util.concurrent.CountDownLatch;
public class TestHashTable {
public static void main(String[] args) {
Hashtable<String,Integer> hashtable = new Hashtable<String,Integer>();
CountDownLatch countDownLatch = new CountDownLatch(10000);
ThreadTable1 threadTable1 = new ThreadTable1();
threadTable1.setCountDownLatch(countDownLatch);
threadTable1.setHashTable(hashtable);
for(int i=0;i<10000;i++)
{
new Thread(threadTable1,"线程"+i).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(hashtable.size());
}
}
class ThreadTable1 implements Runnable
{
Hashtable<String, Integer> hashtable;
CountDownLatch countDownLatch;
public void setCountDownLatch(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void setHashTable(Hashtable<String, Integer> hashtable) {
this.hashtable = hashtable;
}
@Override
public void run() {
hashtable.put("dd", 1);
countDownLatch.countDown();
}
}