Недавно меня задал вопрос, который меня насторожил.
public void swapEngine(Car a, Car b) {
Engine temp = a.engine;
a.engine = b.engine;
b.engine = temp;
}
Это не потокобезопасный метод. Если Thread 1 вызывает swapEngine(car1, car2)
, а затем Thread 2 вызывает swapEngine(car1, car3)
, возможно, что car2
закончит работу с двигателем car3
. Наиболее очевидным способом решения этой проблемы является метод synchronize
.
Синхронизация метода приводит к потенциальной неэффективности. Что делать, если Thread 1 вызывает swapEngine(car1, car2)
и Thread 2 вызывает swapEngine(car3, car4)
? Ни в коем случае эти два потока не могут мешать друг другу. В этом случае идеальной ситуацией будет то, что два потока будут поочередно менять двигатели. Синхронизация метода исключает это из процесса.
Есть ли другой способ поменять местами эти двигатели поточно-безопасным способом, все еще используя parallelism?
Изменить: сделанный метод открыт.