2016-04-24 2 views
3

В Java мы можем реализуем справедливость с помощью блокировки интерфейса и ReentrantLock класса следующей образом:Java Multihreading Синхронизация с замком

Lock lock=new ReentrantLock(true); 

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

Может ли кто-нибудь предоставить подробную информацию о том, как JVM поддерживать следы потоков в ожидании долгого времени, а также как справедливость реализуется JVM.

+1

* Прекрасный замок - это тот, где потоки приобретают замок в том же порядке, в котором они его запрашивали * - не будет ли 'ReentrantLock' просто использовать очередь? Я посмотрел на источник, и у «ReentrantLock» есть 2 статических класса, которые расширяют «AbstractQueuedSynchronizer», а класс для другого - для несправедливого. –

+1

@JonnyHenly Как вы говорите, он использует очередь, как указывает источник. Никакой магии не происходит. +1 –

+1

@PeterLawrey Woohoo! Мне нравится быть неправым. –

ответ

1

Данные содержатся в исходном коде. А исходный код можно найти погуглить для:

  • "java.util.concurrent.locks.ReentrantLock источник"
  • "источник java.util.concurrent.locks.AbstractQueuedSynchronizer"

Код исключительно хорошо прокомментирован.

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

  • В «справедливой» случае, поток, который пытается получить блокировку, когда очередь непустой добавляется в конец очереди.

  • В случае «несправедливого» потока может затекать нить, если замок в настоящий момент свободен. Это дает лучшую производительность, потому что вам не нужно выполнять переключатель контекста потока, который влечет за собой системный вызов.

Смежные вопросы