Меня недавно задал вопрос, который меня озадачил.Переменные переменных в многопоточной среде
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)
? Ни в коем случае эти два потока не могут мешать друг другу. В этом случае идеальной ситуацией будет то, что два потока будут поочередно менять двигатели. Синхронизация метода исключает это из процесса.
Есть ли другой способ обмена этими двигателями в потокобезопасной манере, все еще используя параллелизм?
Редактировать: Использовать способ публичный.
Ну, вы могли бы добавить блокировку (http://docs.oracle.com/javase/7/docs/api/ java/util/concurrent/locks/Lock.html) к экземплярам автомобилей. Затем вы можете заблокировать только те экземпляры, участвующие в обмене. – mkrakhin
@mkrakhin Это будет тупик, подверженный «свопу» (a, b); swap (b, a); ситуация. – Kayaman
@maba, в этом случае тот же автомобиль не может быть в двух магазинах :) – Kishore