Примеры/Иллюстрация алгоритмов без ожидания и без блокировки

Я читал, что безжизненные причины завершают все потоки независимо и без блокировки гарантирует, что программа в целом завершена. Я не мог это получить. Может ли кто-нибудь привести пример (java), иллюстрирующий это.

РЕДАКТИРОВАТЬ: не содержит ли блокировка программа без тупика?

Ответ 1

Если программа заблокирована, это в основном означает, что по крайней мере один из ее потоков гарантированно достигнет прогресса в течение произвольного периода времени. Если программа блокируется, ни один из ее потоков (и, следовательно, программа в целом) не может добиться прогресса - мы можем сказать, что это не блокировка. Поскольку программы без блокировки гарантируют достижение прогресса, они гарантированно завершатся (предполагая конечное выполнение без исключений).

Wait-free - это более сильное условие, которое означает, что каждый поток гарантированно добивается прогресса в течение произвольного периода времени, независимо от времени/порядка выполнения потока; и поэтому мы можем сказать, что нити отделены независимо. Все безжизненные программы блокируются.

Я не знаю из-за каких-либо примеров Java, которые иллюстрируют это, но я могу сказать вам, что программы без блокировки/без ожидания обычно реализуются без блокировок, используя примитивы низкого уровня, такие как инструкции CAS.

Ответ 2

Нет. Lock-free означает программу без блокировок; Btw, a wait-free алгоритм также Lock-free, но не наоборот. Следовательно, оба являются неблокирующими алгоритмами.

Эта запись wiki является отличным чтением для понимания механизма блокировки и ожидания.

Ну, java.util.concurrent.atomic package - пример программирования Lock-free для одиночных переменных. И в Java 7 ConcurrentLinkedQueue является примером реализации wait-free.

Для дальнейшего понимания, я хотел бы, чтобы вы прочитали эту статью, Going atomic от Brian Goetz - парень, который написал Java Concurrency в Практике.

Ответ 3

От более слабого до более сильного условия:

Метод без блокировки, если он гарантирует, что бесконечно часто какой-либо вызов метода заканчивается на конечном числе шагов.

Метод без ожидания, если он гарантирует, что каждый вызов завершает свое выполнение с конечным числом шагов.

Очевидно, что любая реализация метода без ожидания также блокируется, но не наоборот. Алгоритмы без блокировки допускают возможность того, что некоторые потоки могут голодать.

Однако из "Практической перспективы" существует множество ситуаций, когда голодание, хотя это возможно, крайне маловероятно, поэтому алгоритм fast lock-free может быть более привлекательным, чем более медленный алгоритм без ожидания.

ПРИМЕЧАНИЕ.. Еще более сильное свойство называется " ограниченным без ожидания", что означает: существует граница количества шагов может принимать вызов метода.