Como uma ferramenta para compartilhar dados simultaneamente e garantir consistência, os bloqueios têm múltiplas implementações na plataforma JAVA (como sincronizado e ReentrantLock, etc.). Esses bloqueios já escritos proporcionam comodidade para o nosso desenvolvimento, mas a natureza específica e o tipo dos bloqueios raramente são mencionados. Esta série de artigos analisará nomes e características comuns de bloqueios em JAVA para responder às suas perguntas.
bloqueio de bloqueio
Os bloqueios de bloqueio, diferentemente dos bloqueios de rotação, alteram o estado de execução do thread.
No ambiente JAVA, o thread Thread possui os seguintes estados:
1. Novo estado
2. Estado pronto
3. Status de execução
4. Estado bloqueado
5. Estado de morte
Pode-se dizer que o bloqueio de bloqueio permite que o thread entre no estado de bloqueio e espere. Quando o sinal correspondente (despertar, hora) é obtido, o thread pode entrar no estado pronto. Todos os threads no estado pronto entram no estado de execução. através da competição.
Em JAVA, os métodos que podem entrar/sair, bloquear estado ou conter bloqueios de bloqueio incluem, palavra-chave sincronizada (bloqueio de peso entre eles), ReentrantLock, Object.wait()/notify(), LockSupport.park()/unpart()( juc frequentemente usado)
A seguir está um exemplo de bloqueio de bloqueio JAVA:
bloqueio de pacote;importar java.util.concurrent.atomic.AtomicReferenceFieldUpdater;importar java.util.concurrent.locks.LockSupport;classe pública CLHLock1 { classe estática pública CLHNode { thread volátil privado isLocked } @SuppressWarnings("não utilizado") private volátil CLHNode; tail; final estático privado ThreadLocal<CLHNode> LOCAL = novo ThreadLocal<CLHNode>(); private static final AtomicReferenceFieldUpdater<CLHLock1, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLock1.class, CLHNode.class, "tail"); .set(nó); preNode = UPDATER.getAndSet(este, nó); if (preNode != null) { preNode.isLocked = Thread.currentThread(); void unlock() { CLHNode node = LOCAL.get(); null)) { System.out.println("unlock/t" + node.isLocked.getName());
Aqui usamos o bloqueio de bloqueio LockSupport.unpark(). Este exemplo é modificado do bloqueio CLH.
A vantagem dos bloqueios de bloqueio é que os threads bloqueados não ocuparão o tempo da CPU e não causarão ocupação excessiva da CPU, mas o tempo de entrada e o tempo de recuperação são um pouco mais lentos que os bloqueios de rotação.
No caso de concorrência acirrada, o desempenho dos bloqueios de bloqueio é significativamente superior ao dos bloqueios giratórios.
A situação ideal é usar bloqueios de rotação quando a competição de threads não for acirrada e usar bloqueios de bloqueio quando a competição for acirrada.
(O texto completo termina)