StampedLock Classe

Definição

Um bloqueio baseado em funcionalidade 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
StampedLock
Atributos
Implementações

Comentários

Um bloqueio baseado em funcionalidade 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 na aquisição do acesso. Os métodos de conversão e versã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>Escrevendo.</b> O método #writeLock possivelmente bloqueia a espera por acesso exclusivo, retornando um carimbo que pode ser usado no método #unlockWrite para liberar o bloqueio. Versões tryWriteLock não cronometrada e cronometrada 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.</b> O método #readLock 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 tryReadLock não cronometrada e cronometrada também são fornecidas.

<li><b>Leitura otimista.</b> O método #tryOptimisticRead retorna um carimbo diferente de zero somente se o bloqueio não for mantido no modo de gravação no momento. 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 à versão mais recente do bloqueio de gravação ocorrem antes das ações após a chamada para tryOptimisticRead. Esse modo pode ser considerado como uma versão extremamente fraca de um bloqueio de leitura, que pode ser interrompida por um gravador a qualquer momento. O uso do modo de leitura otimista para segmentos de código somente leitura curtos geralmente reduz a contenção e melhora a taxa de transferência. No entanto, seu uso é inerentemente frágil. Seções de leitura otimistas só devem 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 só se aplica 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 normalmente são necessárias ao ler primeiro uma referência de objeto ou matriz e, em seguida, acessar um de seus campos, elementos ou métodos.

</ul>

Essa classe também dá suporte a métodos que fornecem condicionalmente conversões entre os 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 gravação (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 alguns dos bloats de código que, de outra forma, ocorrem 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 eles estão protegendo. Eles não são reentrantes, portanto, os corpos bloqueados não devem chamar outros métodos desconhecidos que podem tentar adquirir novamente 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 das seções de código associadas serem livres de efeito colateral. Seções de leitura otimistas não avaliadas 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 carimbo válido pode ser adivinhado). 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. Os StampedLocks são serializáveis, mas sempre desserializam no estado desbloqueado inicial, portanto, eles não são úteis para bloqueio remoto.

Como java.util.concurrent.Semaphore Semaphore, mas ao contrário da maioria Lock das implementações, StampedLocks não tem noção de propriedade. Os bloqueios adquiridos em um thread podem ser liberados ou convertidos em outro.

A política de agendamento do StampedLock não prefere consistentemente leitores em vez de escritores ou vice-versa. Todos os métodos "try" são de melhor esforço e não estão necessariamente em conformidade com qualquer política de agendamento ou imparcialidade. Um retorno zero de qualquer método "try" para adquirir ou converter bloqueios não contém nenhuma informação sobre o estado do bloqueio; uma invocação subsequente pode ter êxito.

Como dá suporte ao uso coordenado em vários modos de bloqueio, essa classe não implementa diretamente as interfaces ou ReadWriteLock as Lock interfaces. No entanto, um StampedLock pode ser exibido #asReadLock()ou #asReadWriteLock()#asWriteLock()em aplicativos que exigem apenas o conjunto de funcionalidades associado.

<b>Sincronização de Memória.</b> Os 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 do <cite>The Java Language Specification</cite>. Os métodos desbloqueados com êxito no modo de gravação têm os mesmos efeitos de sincronização de memória que uma <ação em>Desbloqueio</em> . Em usos de leitura otimistas, as ações anteriores à ação de desbloqueio do modo de gravação mais recente têm a garantia de ocorrer antes que elas sigam um tryOptimisticRead somente se um validador posterior retornar true; caso contrário, não há nenhuma garantia de que as leituras entre tryOptimisticRead e validar obtenham um instantâneo consistente.

<b>Uso de exemplo.</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, embora elas não sejam estritamente necessárias aqui porque 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.

Java documentação 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 usadas de acordo com os termos descritos na Licença de Atribuição Creative Commons 2.5.

Construtores

Nome Description
StampedLock()

Cria um novo bloqueio, inicialmente em estado desbloqueado.

StampedLock(IntPtr, JniHandleOwnership)

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

Propriedades

Nome Description
Class

Retorna a classe de tempo de execução deste Object.

(Herdado de Object)
Handle

O identificador para a instância subjacente do Android.

(Herdado de Object)
IsReadLocked

Retorna true se o bloqueio for mantido não exclusivamente no momento.

IsWriteLocked

Retorna true se o bloqueio for mantido exclusivamente no momento.

JniIdentityHashCode

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
JniPeerMembers

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

PeerReference

Um bloqueio baseado em funcionalidade 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 funcionalidade com três modos para controlar o acesso de leitura/gravação.

ThresholdType

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

Métodos

Nome Description
AsReadLock()

Retorna uma exibição simples Lock deste StampedLock no qual o Lock#lock método é mapeado #readLocke da mesma forma para outros métodos.

AsReadWriteLock()

Retorna uma ReadWriteLock exibição deste StampedLock no qual o ReadWriteLock#readLock() método é mapeado para #asReadLock(), e ReadWriteLock#writeLock() para #asWriteLock().

AsWriteLock()

Retorna uma exibição simples Lock deste StampedLock no qual o Lock#lock método é mapeado #writeLocke da mesma forma para outros métodos.

Clone()

Cria e retorna uma cópia desse objeto.

(Herdado de Object)
Dispose()

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
Dispose(Boolean)

Um bloqueio baseado em funcionalidade 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 a retenção de um bloqueio.

IsOptimisticReadStamp(Int64)

Informa se um carimbo representa uma leitura otimista bem-sucedida.

IsReadLockStamp(Int64)

Informa se um carimbo representa a retenção de um bloqueio não exclusivamente.

IsWriteLockStamp(Int64)

Informa se um carimbo representa manter um bloqueio 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 desse 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 adquire exclusivamente o bloqueio, bloqueando se necessário até que o thread disponível ou atual seja interrompido.

SetHandle(IntPtr, JniHandleOwnership)

Define a propriedade Handle

(Herdado de Object)
ToArray<T>()

Um bloqueio baseado em funcionalidade 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 determinado, atomicamente, se o carimbo representar a retenção de um bloqueio, o liberará e retornará um carimbo de observação.

TryConvertToReadLock(Int64)

Se o estado de bloqueio corresponder ao carimbo fornecido, executará atomicamente uma das ações a seguir.

TryConvertToWriteLock(Int64)

Se o estado de bloqueio corresponder ao carimbo fornecido, executará atomicamente uma das ações a seguir.

TryOptimisticRead()

Retorna um carimbo que pode ser validado posteriormente ou zero se bloqueado exclusivamente.

TryReadLock()

Adquire o bloqueio de forma não exclusiva se ele estiver disponível imediatamente.

TryReadLock(Int64, TimeUnit)

Não adquire exclusivamente 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 a necessidade de um valor de carimbo.

TryUnlockWrite()

Libera o bloqueio de gravação se ele for mantido, sem exigir um valor de selo.

TryWriteLock()

Adquirirá exclusivamente o bloqueio se ele estiver disponível imediatamente.

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, liberará 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 funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
Validate(Int64)

Retornará true se o bloqueio não tiver sido adquirido exclusivamente desde a emissão do carimbo fornecido.

Wait()

Faz com que o thread atual aguarde até que seja despertado, normalmente sendo <notificado></em> ou <em>interrompido</em>.

(Herdado de Object)
Wait(Int64, Int32)

Faz com que o thread atual aguarde até que seja ativado, normalmente sendo <notificado></em> ou <em>interrompido</em>, ou até que uma determinada quantidade de tempo real tenha decorrido.

(Herdado de Object)
Wait(Int64)

Faz com que o thread atual aguarde até que seja ativado, normalmente sendo <notificado></em> ou <em>interrompido</em>, ou até que uma determinada quantidade de tempo real tenha decorrido.

(Herdado de Object)
WriteLock()

Adquire exclusivamente o bloqueio, bloqueando se necessário até que esteja disponível.

WriteLockInterruptibly()

Adquire exclusivamente o bloqueio, bloqueando se necessário até que ele esteja disponível ou o thread atual seja interrompido.

Implantações explícitas de interface

Nome Description
IJavaPeerable.Disposed()

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
IJavaPeerable.DisposeUnlessReferenced()

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
IJavaPeerable.Finalized()

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
IJavaPeerable.JniManagedPeerState

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

(Herdado de Object)

Métodos de Extensão

Nome Description
GetJniTypeName(IJavaPeerable)

Obtém o nome JNI do tipo da instância self.

JavaAs<TResult>(IJavaPeerable)

Tente coagir a digitar selfTResult, verificando se a coerção é válida no lado Java.

JavaCast<TResult>(IJavaObject)

Executa uma conversão de tipo verificada pelo tempo de execução do Android.

JavaCast<TResult>(IJavaObject)

Um bloqueio baseado em funcionalidade com três modos para controlar o acesso de leitura/gravação.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Tente coagir a digitar selfTResult, verificando se a coerção é válida no lado Java.

Aplica-se a