Подтвердить что ты не робот

Синхронизированный семафор Vs

При чтении concurrency в Java у меня возникают следующие сомнения:

  • Предоставляет ли Java более низкую конструкцию, затем синхронизированную для синхронизации?

  • В каких обстоятельствах мы будем использовать семафор над синхронизированным (который обеспечивает поведение монитора в Java)

4b9b3361

Ответ 1

Синхронизировано позволяет только поток один выполнения доступа к ресурсу одновременно. Семафор допускает до n (вы можете выбрать n) потоков выполнения для доступа к ресурсу в одно и то же время.

Ответ 2

  • Существует также ключевое слово volatile, в соответствии с http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html volatile доступ к переменной более эффективен, чем доступ к этим переменным через синхронизированный код

  • java.util.concurrent.Semaphore используется для ограничения количества потоков, которые могут обращаться к ресурсу. То есть, в то время как synchronized позволяет только одному потоку захватывать блокировку и исполнять синхронизированный блок/метод, Семафор дает разрешение до n потоков, чтобы идти и блокировать другие.

Ответ 3

Существует также atomics. Это дает доступ к базовой аппаратной команде сравнения и замены, которая лежит в основе всей синхронизации. Это позволяет вам, например, безопасно увеличивать число. Если вы ++ поле volatile, другой поток, выполняющий одну и ту же команду, может прочитать поле до того, как ваш поток будет записываться на него, а затем напишите обратно после него. Таким образом, один прирост теряется. Atomics делает чтение и запись "атомарно" и поэтому избегает проблемы.

На самом деле, летучие, синхронизированные утверждения и атомистика имеют тенденцию принудительно обновлять все данные потоков из основной памяти и/или записываться в основную память, поэтому ни один из них не является действительно низким. (Я упрощаю здесь. В отличие от С#, Java действительно не имеет понятия "основная память".)