HashMap и JDK 7 - PullRequest
       24

HashMap и JDK 7

1 голос
/ 01 февраля 2012

Простой эксперимент показал, что JDK7 скомпилированный HashMap<Integer, Integer> использует много потоков при выполнении простого последовательного теста вставки-поиска:

  1. Вставка миллионов чисел.
  2. Поиск сотенмиллионы чисел.

Как получилось?JDK7 автоматически угадывает, как распараллелить этот код ???Мне нужно протестировать однопоточное поведение, как я могу это сделать?

Код, загружено около 2,5 ядер:

import java.util.*;

public class HashSpeed {
        public static void main(String[] args)
        {
                HashMap<Integer, Integer> m = new HashMap<Integer, Integer>(10000);
                final int N = 10000000;

                for (int i=1; i<N; i+=2)
                        m.put(i, i);
                for (int j=0; j<10; j++) {
                        for (int i=0; i<N; i++) {
                                if (m.get(i) != null != (i%2==1)) {
                                        System.out.println("failed");
                                }
                        }
                }
                System.out.println("TEST OK");
        }
}

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Как вы убедились, что код HashMap на самом деле использует несколько потоков Java? Из вашего описания звучит так, будто вы смотрите на уровень ОС (например, диспетчер задач для Windows). Это может быть обманчиво. JVM может использовать несколько потоков для таких вещей, как сборка мусора и т. Д. Но это не означает, что выполняемый код Java использует несколько потоков.

Самый простой способ узнать наверняка - взглянуть на OpenJDK source : -).

0 голосов
/ 01 февраля 2012

Если вы прочитаете исходный код openjdk (это открытый исходный код), вы обнаружите, что HashMap не создает потоки.

Что заставляет вас думать, что это делает?

...