Spec-Zone .ru
спецификации, руководства, описания, API
|
public class ReentrantReadWriteLock extends Object implements ReadWriteLock, Serializable
ReadWriteLock
поддержка подобной семантики к ReentrantLock
. У этого класса есть следующие свойства:
Этот класс не налагает привилегированное упорядочивание читателя или писателя для доступа блокировки. Однако, это действительно поддерживает дополнительную политику справедливости.
Поток, который пытается получить справедливую блокировку чтения (неповторно используемо), блокирует, если или блокировка записи будет сохранена, или есть поток писателя ожидания. Поток не будет получать блокировку чтения до окончания самого старого, в настоящий момент поток писателя ожидания получил и выпустил блокировку записи. Конечно, если писатель ожидания откажется от ожидать, оставляя один или более потоков читателя как самые длинные официанты в очереди со свободной блокировкой записи, то те читатели будут присвоены блокировка чтения.
Поток, который пытается получить справедливую блокировку записи (неповторно используемо), блокирует, если оба, которых блокировка чтения и пишет блокировке, не будут свободны (который подразумевает, что нет никаких потоков ожидания). (Отметьте что неблокирование ReentrantReadWriteLock.ReadLock.tryLock()
и ReentrantReadWriteLock.WriteLock.tryLock()
методы не соблюдают эту справедливую установку и получат блокировку, если это возможно, независимо от потоков ожидания.)
Эта блокировка позволяет и читателям и писателям повторно получать чтение, или запись привязывает стиль a ReentrantLock
. Неповторно используемым читателям не разрешают, пока все блокировки записи, сохраненные потоком записи, не были выпущены.
Дополнительно, писатель может получить блокировку чтения, но не наоборот. Среди других приложений повторная входимость может быть полезной, когда блокировки записи сохранены во время вызовов или обратных вызовов к методам, которые выполняют чтения под блокировками чтения. Если читатель попытается получить блокировку записи, то она никогда не будет успешно выполняться.
Повторная входимость также позволяет понижать от блокировки записи до блокировки чтения, получая блокировку записи, тогда блокировка чтения и затем выпуская блокировку записи. Однако, обновление от блокировки чтения до блокировки записи не возможно.
Блокировка чтения и запись блокируют оба прерывания поддержки во время сбора блокировки.
Condition
поддержка
Блокировка записи обеспечивает a Condition
реализация, которая ведет себя таким же образом, относительно блокировки записи, как Condition
реализация, обеспеченная ReentrantLock.newCondition()
делает для ReentrantLock
. Это Condition
может, конечно, только использоваться с блокировкой записи.
Блокировка чтения не поддерживает a Condition
и readLock().newCondition()
броски UnsupportedOperationException
.
Этот класс поддерживает методы, чтобы определить, сохранены ли блокировки или спорили. Эти методы разрабатываются для состояния системы контроля, не для управления синхронизацией.
Сериализация этого класса ведет себя таким же образом как встроенные блокировки: десериализованная блокировка находится в разблокированном состоянии, независимо от его состояния когда сериализировано.
Демонстрационные использования. Вот эскиз кода, показывающий, как выполнить блокировку, понижая после обновления кэша (обработка исключений особенно хитра, обрабатывая многократные блокировки невложенным способом):
class CachedData {
Object data;
volatile boolean cacheValid;
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
try {
// Recheck state because another thread might have
// acquired write lock and changed state before we did.
if (!cacheValid) {
data = ...
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
} finally {
rwl.writeLock().unlock(); // Unlock write, still hold read
}
}
try {
use(data);
} finally {
rwl.readLock().unlock();
}
}
}
ReentrantReadWriteLocks может использоваться, чтобы улучшить параллелизм в некотором использовании некоторых видов Наборов. Это обычно стоит только, когда наборы, как ожидают, будут большими, получаются доступ большим количеством потоков читателя чем потоки писателя, и влекут за собой операции с издержками, которые перевешивают издержки синхронизации. Например, вот класс, используя TreeMap, который, как ожидают, будет крупным и одновременно полученным доступ. class RWDictionary {
private final Map<String, Data> m = new TreeMap<String, Data>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public String[] allKeys() {
r.lock();
try { return m.keySet().toArray(); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}
Эта блокировка поддерживает максимум 65535 рекурсивных блокировок записи и 65535 блокировок чтения. Попытки превысить эти пределы приводят к Error
броски от блокировки методов.
Модификатор и Тип | Класс и Описание |
---|---|
static class |
ReentrantReadWriteLock. ReadLock
Блокировка возвратилась методом
readLock() . |
static class |
ReentrantReadWriteLock. WriteLock
Блокировка возвратилась методом
writeLock() . |
Конструктор и Описание |
---|
ReentrantReadWriteLock()
Создает новое
ReentrantReadWriteLock с (несправедливыми) свойствами упорядочивания по умолчанию. |
ReentrantReadWriteLock(boolean fair)
Создает новое
ReentrantReadWriteLock с данной политикой справедливости. |
Модификатор и Тип | Метод и Описание |
---|---|
protected Thread |
getOwner()
Возвращает поток, которому в настоящий момент принадлежит блокировка записи, или
null если не принадлежавший. |
protected Collection<Thread> |
getQueuedReaderThreads()
Возвращает набор, содержащий потоки, которые могут ожидать, чтобы получить блокировку чтения.
|
protected Collection<Thread> |
getQueuedThreads()
Возвращает набор, содержащий потоки, которые могут ожидать, чтобы получить или чтение или блокировку записи.
|
protected Collection<Thread> |
getQueuedWriterThreads()
Возвращает набор, содержащий потоки, которые могут ожидать, чтобы получить блокировку записи.
|
int |
getQueueLength()
Возвращает оценку числа потоков, ожидающих, чтобы получить или чтение или блокировку записи.
|
int |
getReadHoldCount()
Запросы число повторно используемого чтения держатся эта блокировка текущим потоком.
|
int |
getReadLockCount()
Запрашивает число блокировок чтения, сохраненных для этой блокировки.
|
protected Collection<Thread> |
getWaitingThreads(Condition condition)
Возвращает набор, содержащий те потоки, которые могут ожидать на данном условии, связанном с блокировкой записи.
|
int |
getWaitQueueLength(Condition condition)
Возвращает оценку числа потоков, ожидающих на данном условии, связанном с блокировкой записи.
|
int |
getWriteHoldCount()
Запросы число повторно используемой записи держатся эта блокировка текущим потоком.
|
boolean |
hasQueuedThread(Thread thread)
Запросы, ожидает ли данный поток, чтобы получить или чтение или блокировку записи.
|
boolean |
hasQueuedThreads()
Запросы, ожидают ли какие-либо потоки, чтобы получить блокировка записи или чтение.
|
boolean |
hasWaiters(Condition condition)
Запросы, ожидают ли какие-либо потоки на данном условии, связанном с блокировкой записи.
|
boolean |
isFair()
Возвраты
true если у этой блокировки есть истина набора справедливости. |
boolean |
isWriteLocked()
Запросы, если блокировка записи сохранена каким-либо потоком.
|
boolean |
isWriteLockedByCurrentThread()
Запросы, если блокировка записи сохранена текущим потоком.
|
ReentrantReadWriteLock. ReadLock |
readLock()
Возвращает блокировку, используемую для того, чтобы читать.
|
Строка |
toString()
Возвращает строку, идентифицирующую эту блокировку, так же как ее состояние блокировки.
|
ReentrantReadWriteLock. WriteLock |
writeLock()
Возвращает блокировку, используемую для того, чтобы записать.
|
public ReentrantReadWriteLock()
ReentrantReadWriteLock
с (несправедливыми) свойствами упорядочивания по умолчанию.public ReentrantReadWriteLock(boolean fair)
ReentrantReadWriteLock
с данной политикой справедливости.fair
- true
если эта блокировка должна использовать справедливую политику упорядочиванияpublic ReentrantReadWriteLock.WriteLock writeLock()
ReadWriteLock
writeLock
в интерфейсе ReadWriteLock
public ReentrantReadWriteLock.ReadLock readLock()
ReadWriteLock
readLock
в интерфейсе ReadWriteLock
public final boolean isFair()
true
если у этой блокировки есть истина набора справедливости.true
если у этой блокировки есть истина набора справедливостиprotected Thread getOwner()
null
если не принадлежавший. Когда этот метод вызывает поток, который не является владельцем, возвращаемое значение отражает приближение максимальных усилий текущего состояния блокировки. Например, владелец может быть на мгновение null
даже если есть потоки, пытающиеся получать блокировку, но еще не сделали так. Этот метод разрабатывается, чтобы облегчить конструкцию подклассов, которые предоставляют более обширные контрольные услуги блокировки.null
если не принадлежавшийpublic int getReadLockCount()
public boolean isWriteLocked()
true
если какой-либо поток содержит блокировку записи и false
иначеpublic boolean isWriteLockedByCurrentThread()
true
если текущий поток содержит блокировку записи и false
иначеpublic int getWriteHoldCount()
public int getReadHoldCount()
protected Collection<Thread> getQueuedWriterThreads()
protected Collection<Thread> getQueuedReaderThreads()
public final boolean hasQueuedThreads()
true
возврат не гарантирует, что любой другой поток будет когда-либо получать блокировку. Этот метод разрабатывается прежде всего для использования в контроле системного состояния.true
если могут быть другие потоки, ожидающие, чтобы получить блокировкуpublic final boolean hasQueuedThread(Thread thread)
true
возврат не гарантирует, что этот поток будет когда-либо получать блокировку. Этот метод разрабатывается прежде всего для использования в контроле системного состояния.thread
- потокtrue
если данный поток ставится в очередь, ожидая этой блокировкиNullPointerException
- если поток является нулемpublic final int getQueueLength()
protected Collection<Thread> getQueuedThreads()
public boolean hasWaiters(Condition condition)
true
возврат не гарантирует что будущее signal
пробудит любые потоки. Этот метод разрабатывается прежде всего для использования в контроле системного состояния.condition
- условиеtrue
если есть какие-либо потоки ожиданияIllegalMonitorStateException
- если эта блокировка не сохраненаIllegalArgumentException
- если данное условие не связывается с этой блокировкойNullPointerException
- если условие является нулемpublic int getWaitQueueLength(Condition condition)
condition
- условиеIllegalMonitorStateException
- если эта блокировка не сохраненаIllegalArgumentException
- если данное условие не связывается с этой блокировкойNullPointerException
- если условие является нулемprotected Collection<Thread> getWaitingThreads(Condition condition)
condition
- условиеIllegalMonitorStateException
- если эта блокировка не сохраненаIllegalArgumentException
- если данное условие не связывается с этой блокировкойNullPointerException
- если условие является нулемpublic String toString()
"Write locks ="
сопровождаемый числом повторно используемо сохраненных блокировок записи, и Строкой "Read locks ="
сопровождаемый числом сохраненных блокировок чтения.
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.