Я нахожусь на 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()) {}
}