【发布时间】:2020-08-17 01:34:48
【问题描述】:
在一次采访中,面试官问我 ConcurrentHashMap 与 HashTable 有何不同。我只是想讨论一下面试官不相信的一点。我在 ConcurrentHashMap 中说过,任意数量的线程可以同时执行读取操作,而在 HashTable 中一次只能执行一个线程。然后他为 ConcurrentHashMap 提供了一个场景,假设一个线程正在一个段上写入,同时另一个线程正在读取它的值,第二个线程是否会被阻塞?我说不,但他不相信。我检查了javadoc,上面写着..
检索操作(包括get)一般不会 块,因此可能与更新操作重叠(包括 put 并删除)。检索反映了最 最近完成的更新操作持有他们的 发作。
上面写着检索操作不阻塞但是加了generally这是什么意思??
为此,我编写了一个程序,其中两个线程对 ConcurrentHashMap 和 HashTable 以及 synchronizedMap 执行读写操作: 我正在对同一段执行一秒钟的读写操作
class ReaderThread extends Thread {
private Map<String, Integer> map;
private static boolean b = false;
public ReaderThread(Map<String, Integer> map) {
this.map = map;
}
public void run() {
long startTime = System.nanoTime();
long endTime = 0;
while (!b) {
map.get("A");
endTime = System.nanoTime();
if (endTime - startTime > 1000000000L)
b = true;
}
}
}
class WriterThread extends Thread {
private Map<String, Integer> map;
private static int n = 0;
private static boolean b = false;
public WriterThread(Map<String, Integer> map) {
this.map = map;
}
public void run() {
long startTime = System.nanoTime();
long endTime = 0;
while (!b) {
map.put("A", n++);
endTime = System.nanoTime();
if (endTime - startTime > 1000000000L)
b = true;
}
}
}
public class DiffrentMapReadWritePerformanceTest {
public static void main(String[] args) throws InterruptedException {
Map<String, Integer> map = new ConcurrentHashMap<>();
// Map<String, Integer> map = new Hashtable<>();
// Map<String, Integer> map = new HashMap<>();
// map = Collections.synchronizedMap(map);
Thread readerThread = new ReaderThread(map);
Thread writerThread = new WriterThread(map);
writerThread.start();
readerThread.start();
writerThread.join();
readerThread.join();
System.out.println(map.get("A"));
}
}
以及基于不同地图对象的O/P: 并发哈希映射:8649407 哈希表:5284068 同步地图:5438039
因此输出证明 ConcurrentHashMap 在多线程环境中相对于 HashTable 快,但不能证明在写入线程正在写入时,读取线程没有被阻止读取。有什么方法可以确认吗??
【问题讨论】:
-
像
map.get("A")这样的调用没有使用结果,并不能证明任何事情。它甚至不需要在运行时实际发生。此外,测量的性能永远无法证明某些事情是否在幕后发生。您必须查看ConcurrentHashMap的代码。然后,您会发现 A) 没有段(从 Java 8 开始)和 B)get确实没有阻塞。
标签: java multithreading concurrency hashtable concurrenthashmap