Ответ 1
Синхронизировано позволяет только поток один выполнения доступа к ресурсу одновременно. Семафор допускает до n (вы можете выбрать n) потоков выполнения для доступа к ресурсу в одно и то же время.
При чтении concurrency в Java у меня возникают следующие сомнения:
Предоставляет ли Java более низкую конструкцию, затем синхронизированную для синхронизации?
В каких обстоятельствах мы будем использовать семафор над синхронизированным (который обеспечивает поведение монитора в Java)
Синхронизировано позволяет только поток один выполнения доступа к ресурсу одновременно. Семафор допускает до n (вы можете выбрать n) потоков выполнения для доступа к ресурсу в одно и то же время.
Существует также ключевое слово volatile
, в соответствии с http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html volatile
доступ к переменной более эффективен, чем доступ к этим переменным через синхронизированный код
java.util.concurrent.Semaphore
используется для ограничения количества потоков, которые могут обращаться к ресурсу. То есть, в то время как synchronized
позволяет только одному потоку захватывать блокировку и исполнять синхронизированный блок/метод, Семафор дает разрешение до n потоков, чтобы идти и блокировать другие.
Существует также atomics. Это дает доступ к базовой аппаратной команде сравнения и замены, которая лежит в основе всей синхронизации. Это позволяет вам, например, безопасно увеличивать число. Если вы ++
поле volatile, другой поток, выполняющий одну и ту же команду, может прочитать поле до того, как ваш поток будет записываться на него, а затем напишите обратно после него. Таким образом, один прирост теряется. Atomics делает чтение и запись "атомарно" и поэтому избегает проблемы.
На самом деле, летучие, синхронизированные утверждения и атомистика имеют тенденцию принудительно обновлять все данные потоков из основной памяти и/или записываться в основную память, поэтому ни один из них не является действительно низким. (Я упрощаю здесь. В отличие от С#, Java действительно не имеет понятия "основная память".)