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

Синхронизированный порядок выпуска

Я просмотрел всю документацию java в операторах synchronized, которые искали ответ на этот вопрос, не повезло.

Скажем, что у меня есть thread1, thread2, thread3, пытающиеся запустить следующий код одновременно.

 synchronized(lockObj) { 
     doSomething();
 }

Предположим, что thread1 получает сначала doSomething(), thread2, затем thread3, который будет блокировать и ждать в операторе synchronized.

Вопрос

  • Когда thread1 освобождает блокировку, какой из потоков будет выпущен первым?
  • Что такое правило общего порядка, которое применяется при освобождении блокировки?
4b9b3361

Ответ 1

1. Либо thread2, либо thread3. Нет гарантии:

Кроме того, не следует делать никаких предположений о порядке, в котором потокам предоставляется право собственности на монитор или порядок, в котором потоки просыпаются в ответ на метод уведомления или уведомления.

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/thread-priorities.html#general

2. Мониторы Java (synchronized/await/notify/notifyAll) не соответствуют действительности. У примитивов синхронизации из java 1.5 обычно есть параметры для обеспечения справедливости. Имейте в виду, что справедливая версия имеет значительно более высокую производительность, обычно следует использовать не справедливую версию: статистически, каждому потоку будет предоставлена ​​возможность запускать, даже если заказ не будет строго соблюден.

Программы, использующие удаленные блокировки, к которым обращаются многие потоки, могут отображать более низкую общую пропускную способность (т.е. медленнее, часто намного медленнее), чем те, которые используют настройку по умолчанию, но имеют меньшие отклонения во времени, чтобы получить блокировки и гарантировать отсутствие голода. Обратите внимание, однако, что справедливость блокировок не гарантирует справедливость планирования потоков. Таким образом, один из многих потоков, использующих справедливую блокировку, может получать его несколько раз подряд, тогда как другие активные потоки не развиваются и в настоящее время не удерживают блокировку. Также обратите внимание, что метод untimed tryLock не соблюдает настройку справедливости. Это будет успешным, если блокировка будет доступна, даже если другие потоки ждут.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#ReentrantLock%28boolean%29