Мы можем реализовать взаимное исключение в java с замком (intrinsi c lock или ReentrantLock):
Lock lock = new ReentrantLock();
try {
lock.lock();
//do something
}
} finally {
lock.unlock();
}
или с семфором (1)
Semaphore semaphore = new Semaphore(1);
try {
semaphore.acquire();
//do soemthing
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
Я вижу, что преимущество семафора здесь в том, что он переводит потоки в состояние WAITING, а блокировка переводит потоки в состояние BLOCKED (BLOCKED увеличивает нагрузку на планировщик). fromThisAnswer
Считается ли плохой практикой использование семафора для взаимного исключения? Должны ли мы всегда отдавать предпочтение замкам для взаимного исключения?