В интервью интервьюер спросил меня, чем ConcurrentHashMap отличается от HashTable. Я просто хочу обсудить вопрос, в котором интервьюер не убедился. Я сказал, что в ConcurrentHashMap любое количество потоков может одновременно выполнять операцию чтения, тогда как в HashTable одновременно может выполняться только один поток. Затем он дал сценарий для ConcurrentHashMap, предположив, что один поток пишет в одном сегменте, и в то же время другой поток читает его значение. Будет ли второй поток заблокирован ?? Я сказал нет, но он не был убежден. Я проверил в javado c, который говорит ..
Операции получения (в том числе get) обычно не блокируются, поэтому могут перекрываться с операциями обновления (включая put и remove). Извлечения отражают результаты самых последних завершенных операций обновления, сохраняющих их начало.
В нем говорится, что операции извлечения не блокируются, а добавляются 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 на основе различных объектов карты : ConcurrentHashMap: 8649407 Хеш-таблица: 5284068 synchronizedMap: 5438039
Следовательно, вывод подтверждает, что ConcurrentHashMap работает быстро относительно HashTable в многопоточной среде, но не доказывает, что во время записи потока записи поток чтения не был заблокирован для чтения. Есть ли способ подтвердить это ??