Я нахожусь на quadcore, и ваш обновленный код не работает с 2 потоками (это работает с 1). Кроме того, в моем коде я использую только синхронизированный для уменьшения счетчика, я занят ожиданием вне синхронизированной части, верно?

сто запускал многопоточный код на 4-ядерном компьютере в надежде, что он будет быстрее, чем на одноядерном компьютере. Вот идея: я получил фиксированное количество потоков (в моем случае один поток на ядро). Каждый поток выполняетRunnable формы:

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();
    }
}

На четырехъядерной машине этот код выполняетхуже с 4 потоками, чем с 1 потоком. Даже сCyclicBarrierСверхурочные, я бы подумал, что код должен работать как минимум в 2 раза быстрее. Почему это работаетпомедленнее?

РЕДАКТИРОВАТЬ: Вот реализация напряженного ожидания я попробовал. К сожалению, это заставляет программу работать медленнее на большем количестве ядер (также обсуждается в отдельном вопросеВот):

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()) {}
}

Ответы на вопрос(5)

Ваш ответ на вопрос