Поскольку Java 7 заявляет, что в некоторых случаях он может избегать анализа и в некоторых случаях удалять неконтролируемую синхронизацию, я дал ему тест
public static void main(String[] args)
{
for(int i=0; i<100; i++)
{
System.out.println("-------------------");
testS();
}
}
static int N = 100_000_000;
static void testS()
{
Object o = new Object();
long t0 = System.nanoTime();
for(int i=0; i<N; i++)
synchronized (o){}
long t = System.nanoTime() - t0;
System.out.printf("time: %,d%n", t);
}
Я не могу вспомнить более простой пример для анализа побега. Однако очевидно, что Java 7 не оптимизирует синхронизацию в моем тесте; каждый synchronized (o){}
потребляет некоторое время.
Удивительно, но он потребляет всего около 1 такта процессора, что слишком быстро, чтобы поверить. Он должен содержать как минимум две инструкции сравнения и установки; Доступ к кэш-памяти L1 обычно занимает 10 циклов. По-видимому, начинается оптимизация оборудования.
Это жесткая петля, а не реальное приложение. В общем, слишком сложно обсуждать реальные приложения; трудно анализировать даже для конкретного применения. Тогда мы, вероятно, должны предпочесть HashMap, если это возможно, что, по крайней мере, не будет медленнее, чем Hashtable в любом случае, насколько нам известно.