Bloqueio reentrante

Condição - a aplicação de condições em bloqueios permite obter controle sobre o gerenciamento de acesso a fluxos. A condição de bloqueio é um objeto da interface Condition dojava.util.concurrent.locks. O uso de objetos Condition é, em muitos aspectos, semelhante ao uso doswait/notify/notifyAllclasse Object , que foram discutidos em um dos tópicos anteriores.

Lock é uma interface daestrutura de bloqueioque fornece uma abordagem flexível para restringir o acesso a recursos/blocos em comparação com o sincronizado. Ao usar vários bloqueios, a ordem de liberação deles pode ser arbitrária, além de também ser configurada. Existe também a possibilidade de lidar com a situação quando o bloqueio já está capturado.

ReentrantLock é uma das implementações da interface Lock , a classe ReentrantLock . Permite que a mesma thread chame o método lock, mesmo que já o tenha chamado antes, sem liberar o lock.

A classe ReentrantLock , além dos métodos da interface Lock , possui um método fábrica newCondition() . Este método retorna um objetoDoença, que permite adicionar o thread atual ao conjunto de espera do objeto fornecidoDoença.

private final Lock R_LOCK = ReentrantLock();
R_LOCK.lock();
try {
   //some action happens here
} finally {
   R_LOCK.unlock();
}

ReadWriteLock é uma interface para criar bloqueios de leitura/gravação. Os bloqueios são extremamente úteis quando um sistema possui muitas leituras e poucas gravações.

ReentrantReadWriteLock - usado em caches e serviços multi-threaded, tem um bom aumento de desempenho em comparação com blocos sincronizados. Na verdade, a classe funciona em 2 modos mutuamente exclusivos: muitos leitores lêem dados em paralelo e quando apenas 1 gravador escreve dados.

ReentrantReadWriteLock.ReadLock - bloqueio de leitura para leitores, obtido via readWriteLock.readLock().

ReentrantReadWriteLock.WriteLock - bloqueio de gravação para gravadores, obtido via readWriteLock.writeLock().

Sincronizador

AbstractOwnableSynchronizer é a classe base responsável por construir mecanismos de sincronização. Contém um getter/setter para lembrar e ler um fluxo exclusivo que pode operar em seus dados.

AbstractQueuedSynchronizer é a classe base para o mecanismo de sincronização em FutureTask, CountDownLatch, Semaphore, ReentrantLock, ReentrantReadWriteLock. Também é usado ao criar novos mecanismos de sincronização que dependem de um valor int único e atômico.

AbstractQueuedLongSynchronizer é uma variante de AbstractQueuedSynchronizer que suporta o valor atômico longo.