StampedLock Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação.
[Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)]
public class StampedLock : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)>]
type StampedLock = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Herança
- Atributos
- Implementações
Comentários
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. O estado de um StampedLock consiste em uma versão e modo. Os métodos de aquisição de bloqueio retornam um carimbo que representa e controla o acesso em relação a um estado de bloqueio; As versões "try" desses métodos podem, em vez disso, retornar o valor especial zero para representar a falha ao adquirir acesso. Os métodos de liberação e conversão de bloqueio exigem carimbos como argumentos e falham se não corresponderem ao estado do bloqueio. Os três modos são:
<ul>
<li><b>Redação.<O método #writeLock
/b> possivelmente bloqueia a espera de acesso exclusivo, retornando um carimbo que pode ser usado no método #unlockWrite
para liberar o bloqueio. Versões não cronometradas e cronometradas do tryWriteLock
também são fornecidas. Quando o bloqueio é mantido no modo de gravação, nenhum bloqueio de leitura pode ser obtido e todas as validações de leitura otimistas falharão.
<li><b>Leitura.<O método #readLock
/b> possivelmente bloqueia a espera por acesso não exclusivo, retornando um carimbo que pode ser usado no método #unlockRead
para liberar o bloqueio. Versões não cronometradas e cronometradas do tryReadLock
também são fornecidas.
<li><b>Leitura otimista.<O Método #tryOptimisticRead
/b> retorna um carimbo diferente de zero somente se o bloqueio não estiver atualmente no modo de gravação. O método #validate
retornará true se o bloqueio não tiver sido adquirido no modo de gravação desde a obtenção de um determinado carimbo, caso em que todas as ações anteriores à liberação de bloqueio de gravação mais recente acontecerão antes das ações após a chamada para tryOptimisticRead
. Este modo pode ser pensado como uma versão extremamente fraca de um bloqueio de leitura, que pode ser quebrado por um escritor a qualquer momento. O uso do modo de leitura otimista para segmentos curtos de código somente leitura geralmente reduz a contenção e melhora a taxa de transferência. No entanto, seu uso é inerentemente frágil. As seções de leitura otimista devem apenas ler campos e mantê-los em variáveis locais para uso posterior após a validação. Os campos lidos no modo de leitura otimista podem ser extremamente inconsistentes, portanto, o uso se aplica somente quando você estiver familiarizado o suficiente com representações de dados para verificar a consistência e/ou invocar repetidamente o método validate()
. Por exemplo, essas etapas geralmente são necessárias ao ler pela primeira vez uma referência de objeto ou matriz e, em seguida, acessar um de seus campos, elementos ou métodos.
</ul>
Essa classe também oferece suporte a métodos que condicionalmente fornecem conversões nos três modos. Por exemplo, o método #tryConvertToWriteLock
tenta "atualizar" um modo, retornando um carimbo de gravação válido se (1) já estiver no modo de escrita (2) no modo de leitura e não houver outros leitores ou (3) no modo de leitura otimista e o bloqueio estiver disponível. As formas desses métodos são projetadas para ajudar a reduzir parte do inchaço de código que, de outra forma, ocorre em designs baseados em repetição.
StampedLocks são projetados para uso como utilitários internos no desenvolvimento de componentes thread-safe. Seu uso depende do conhecimento das propriedades internas dos dados, objetos e métodos que estão protegendo. Eles não são reentrantes, então os corpos bloqueados não devem chamar outros métodos desconhecidos que podem tentar readquirir bloqueios (embora você possa passar um carimbo para outros métodos que podem usá-lo ou convertê-lo). O uso de modos de bloqueio de leitura depende de as seções de código associadas serem livres de efeitos colaterais. Seções de leitura otimista não validadas não podem chamar métodos que não são conhecidos por tolerar possíveis inconsistências. Os selos usam representações finitas e não são criptograficamente seguros (ou seja, um selo válido pode ser adivinhável). Os valores de carimbo podem ser reciclados após (não antes de) um ano de operação contínua. Um carimbo mantido sem uso ou validação por mais tempo do que esse período pode não ser validado corretamente. StampedLocks são serializáveis, mas sempre desserializam no estado desbloqueado inicial, portanto, não são úteis para bloqueio remoto.
Como java.util.concurrent.Semaphore Semaphore
, mas ao contrário da maioria das Lock
implementações, StampedLocks não têm noção de propriedade. Bloqueios adquiridos em um thread podem ser liberados ou convertidos em outro.
A política de agendamento do StampedLock não prefere consistentemente os leitores aos escritores ou vice-versa. Todos os métodos de "tentativa" são de melhor esforço e não necessariamente estão em conformidade com qualquer política de agendamento ou equidade. Um retorno zero de qualquer método de "tentativa" para adquirir ou converter bloqueios não traz nenhuma informação sobre o estado do bloqueio; uma invocação subsequente pode ser bem-sucedida.
Como oferece suporte ao uso coordenado em vários modos de bloqueio, essa classe não implementa diretamente as Lock
interfaces OR ReadWriteLock
. No entanto, um StampedLock pode ser exibido #asReadLock()
, #asWriteLock()
ou #asReadWriteLock()
em aplicativos que exigem apenas o conjunto associado de funcionalidade.
<b>Sincronização de memória.</b> Métodos com o efeito de bloquear com êxito em qualquer modo têm os mesmos efeitos de sincronização de memória que uma <ação em>Lock</em> , conforme descrito no Capítulo 17 de <cite>The Java Language Specification</cite>. Os métodos de desbloqueio bem-sucedido no modo de gravação têm os mesmos efeitos de sincronização de memória que uma <ação em>Unlock</em> . Em usos de leitura otimistas, as ações anteriores à ação de desbloqueio do modo de gravação mais recente são garantidas antes daquelas que seguem um tryOptimisticRead somente se uma validação posterior retornar true; caso contrário, não há garantia de que as leituras entre tryOptimisticRead e validate obtenham um instantâneo consistente.
<b>Exemplo de uso.</b> O seguinte ilustra alguns idiomas de uso em uma classe que mantém pontos bidimensionais simples. O código de exemplo ilustra algumas convenções try/catch, mesmo que elas não sejam estritamente necessárias aqui, pois nenhuma exceção pode ocorrer em seus corpos.
{@code
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
// an exclusively locked method
void move(double deltaX, double deltaY) {
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
// a read-only method
// upgrade from optimistic read to read lock
double distanceFromOrigin() {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.readLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
return Math.hypot(currentX, currentY);
}
} finally {
if (StampedLock.isReadLockStamp(stamp))
sl.unlockRead(stamp);
}
}
// upgrade from optimistic read to write lock
void moveIfAtOrigin(double newX, double newY) {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.writeLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
if (currentX != 0.0 || currentY != 0.0)
break;
stamp = sl.tryConvertToWriteLock(stamp);
if (stamp == 0L)
continue retryHoldingLock;
// exclusive access
x = newX;
y = newY;
return;
}
} finally {
if (StampedLock.isWriteLockStamp(stamp))
sl.unlockWrite(stamp);
}
}
// upgrade read lock to write lock
void moveIfAtOrigin2(double newX, double newY) {
long stamp = sl.readLock();
try {
while (x == 0.0 && y == 0.0) {
long ws = sl.tryConvertToWriteLock(stamp);
if (ws != 0L) {
stamp = ws;
x = newX;
y = newY;
break;
}
else {
sl.unlockRead(stamp);
stamp = sl.writeLock();
}
}
} finally {
sl.unlock(stamp);
}
}
}}
Adicionado em 1.8.
Documentação Java para java.util.concurrent.locks.StampedLock
.
Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usado de acordo com os termos descritos na Creative Commons 2.5 Attribution License.
Construtores
StampedLock() |
Cria um novo bloqueio, inicialmente no estado desbloqueado. |
StampedLock(IntPtr, JniHandleOwnership) |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. |
Propriedades
Class |
Retorna a classe de tempo de execução deste |
Handle |
O identificador para a instância subjacente do Android. (Herdado de Object) |
IsReadLocked |
Retorna |
IsWriteLocked |
Retorna |
JniIdentityHashCode |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
JniPeerMembers |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. |
PeerReference |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
ReadLockCount |
Consulta o número de bloqueios de leitura mantidos para esse bloqueio. |
ThresholdClass |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. |
ThresholdType |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. |
Métodos
AsReadLock() |
Retorna uma exibição simples |
AsReadWriteLock() |
Retorna um |
AsWriteLock() |
Retorna uma exibição simples |
Clone() |
Cria e retorna uma cópia desse objeto. (Herdado de Object) |
Dispose() |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
Dispose(Boolean) |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
Equals(Object) |
Indica se algum outro objeto é "igual" a este. (Herdado de Object) |
GetHashCode() |
Retorna um valor de código hash para o objeto. (Herdado de Object) |
IsLockStamp(Int64) |
Informa se um carimbo representa segurar um cadeado. |
IsOptimisticReadStamp(Int64) |
Informa se um selo representa uma leitura otimista bem-sucedida. |
IsReadLockStamp(Int64) |
Informa se um carimbo representa segurar um cadeado não exclusivamente. |
IsWriteLockStamp(Int64) |
Informa se um carimbo representa segurar um cadeado exclusivamente. |
JavaFinalize() |
Chamado pelo coletor de lixo em um objeto quando a coleta de lixo determina que não há mais referências ao objeto. (Herdado de Object) |
Notify() |
Ativa um único thread que está aguardando no monitor deste objeto. (Herdado de Object) |
NotifyAll() |
Ativa todos os threads que estão aguardando no monitor deste objeto. (Herdado de Object) |
ReadLock() |
Não adquire exclusivamente o bloqueio, bloqueando se necessário até que esteja disponível. |
ReadLockInterruptibly() |
Não exclusivamente adquire o bloqueio, bloqueando se necessário até que esteja disponível ou o thread atual seja interrompido. |
SetHandle(IntPtr, JniHandleOwnership) |
Define a propriedade Handle. (Herdado de Object) |
ToArray<T>() |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
ToString() |
Retorna uma representação de cadeia de caracteres do objeto. (Herdado de Object) |
TryConvertToOptimisticRead(Int64) |
Se o estado de bloqueio corresponder ao carimbo fornecido, então, atomicamente, se o carimbo representar segurar um cadeado, libera-o e retorna um carimbo de observação. |
TryConvertToReadLock(Int64) |
Se o estado de bloqueio corresponder ao carimbo fornecido, execute atomicamente uma das seguintes ações. |
TryConvertToWriteLock(Int64) |
Se o estado de bloqueio corresponder ao carimbo fornecido, execute atomicamente uma das seguintes ações. |
TryOptimisticRead() |
Retorna um carimbo que pode ser validado posteriormente ou zero se estiver exclusivamente bloqueado. |
TryReadLock() |
Não exclusivamente adquire o bloqueio se ele estiver imediatamente disponível. |
TryReadLock(Int64, TimeUnit) |
Não exclusivamente adquire o bloqueio se ele estiver disponível dentro do tempo determinado e o thread atual não tiver sido interrompido. |
TryUnlockRead() |
Libera uma retenção do bloqueio de leitura se ele for mantido, sem exigir um valor de carimbo. |
TryUnlockWrite() |
Libera o bloqueio de gravação se ele for mantido, sem exigir um valor de carimbo. |
TryWriteLock() |
Adquire exclusivamente o cadeado se este estiver imediatamente disponível. |
TryWriteLock(Int64, TimeUnit) |
Adquire exclusivamente o bloqueio se ele estiver disponível dentro do tempo determinado e o thread atual não tiver sido interrompido. |
Unlock(Int64) |
Se o estado de bloqueio corresponder ao carimbo fornecido, libera o modo correspondente do bloqueio. |
UnlockRead(Int64) |
Se o estado de bloqueio corresponder ao carimbo fornecido, liberará o bloqueio não exclusivo. |
UnlockWrite(Int64) |
Se o estado de bloqueio corresponder ao carimbo fornecido, liberará o bloqueio exclusivo. |
UnregisterFromRuntime() |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
Validate(Int64) |
Devoluções verdadeiras se o cadeado não tiver sido adquirido exclusivamente desde a emissão do selo dado. |
Wait() |
Faz com que o thread atual aguarde até que ele seja ativado, normalmente sendo <em notificado</em> ou <em>interrompido</em>>. (Herdado de Object) |
Wait(Int64, Int32) |
Faz com que o thread atual aguarde até que ele seja despertado, normalmente sendo <em>notificado</em> ou <em interrompido</em>, ou até que>uma certa quantidade de tempo real tenha decorrido. (Herdado de Object) |
Wait(Int64) |
Faz com que o thread atual aguarde até que ele seja despertado, normalmente sendo <em>notificado</em> ou <em interrompido</em>, ou até que>uma certa quantidade de tempo real tenha decorrido. (Herdado de Object) |
WriteLock() |
Adquire exclusivamente a fechadura, bloqueando se necessário até que esteja disponível. |
WriteLockInterruptibly() |
Adquire exclusivamente o bloqueio, bloqueando se necessário até que esteja disponível ou a rosca atual seja interrompida. |
Implantações explícitas de interface
IJavaPeerable.Disposed() |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
IJavaPeerable.DisposeUnlessReferenced() |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
IJavaPeerable.Finalized() |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
IJavaPeerable.JniManagedPeerState |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. (Herdado de Object) |
Métodos de Extensão
JavaCast<TResult>(IJavaObject) |
Executa uma conversão de tipo verificada em tempo de execução do Android. |
JavaCast<TResult>(IJavaObject) |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. |
GetJniTypeName(IJavaPeerable) |
Um bloqueio baseado em recursos com três modos para controlar o acesso de leitura/gravação. |