Java - código multithreaded não roda mais rápido em mais núcleos

Eu estava executando um código multithread em uma máquina de 4 núcleos na esperança de que fosse mais rápido do que em uma máquina de núcleo único. Aqui está a idéia: eu tenho um número fixo de threads (no meu caso, um thread por núcleo). Cada thread executa umRunnable do formulário:

private static int[] data; // data shared across all threads


public void run() {

    int i = 0;

    while (i++ < 5000) {

        // do some work
        for (int j = 0; j < 10000 / numberOfThreads) {
            // each thread performs calculations and reads from and
            // writes to a different part of the data array
        }

        // wait for the other threads
        barrier.await();
    }
}

Em uma máquina quadcore, esse código executapio com 4 fios do que com 1 fio. Mesmo com oCyclicBarrier sobrecarga, eu teria pensado que o código deve executar pelo menos duas vezes mais rápido. Por que ele rodaMais devaga?

EDIT: Aqui está uma implementação de espera ocupada que tentei. Infelizmente, isso torna o programa mais lento em mais núcleos (também discutido em uma pergunta separadaAqu):

public void run() {

    // do work

    synchronized (this) {

        if (atomicInt.decrementAndGet() == 0) {

            atomicInt.set(numberOfOperations);

            for (int i = 0; i < threads.length; i++)
                threads[i].interrupt();
        }
    }

    while (!Thread.interrupted()) {}
}

questionAnswers(5)

yourAnswerToTheQuestion