Distribuído redssion Bloqueio

Distribuído redssion Bloqueio

forma integrada

aproximado

Análise de código

  • Adquirir um bloqueio

    A chamada de um retorno real após RedissonLock objetos método getLock ()

  • bloqueio

    Na fechadura RedissonLock objecto () chamada de método para tryAcquire principal método (), o leasetime == -1, em seguida, ir método tryLockInnerAsync (),

  • Bloqueando detalhes

    Combinação da declaração de parâmetro acima, podemos saber, aqui KEYS [1] é getName (), ARGV [2] é getLockName (ThreadID), passar o tempo e assumir que o nome de bloqueio adquirido é "anyLock", o ID thread é assumido que a chamada é thread -1 é assumido tipo UUID ID variável membro é 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: 65, em seguida, CHAVES [1] = anyLock, ARGV [2] = 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: Linha-1, assim , isso significa que um script, é determinado que não há um chamado "anyLock" de key2, se não, em que é fornecido um campo "85b196ce-e6f2-42ff-b3d7-6615b6748b5d: thread-1", o valor " uma "chave, e definir o seu tempo de validade 3, se presente, é também definido" 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: Linha-1 "existe, se estiver presente, o seu valor é incrementado por um, e re 4 definir o tempo de expiração, retorno ao "anyLock" tempo de sobrevida (ms)

  • estrutura de bloqueio Redis

    As estruturas de dados aqui é o hash, estrutura hash é: uma chave de Campo 1 Campo 2 valor o valor de 2. . . Sob este cenário com fechadura, chave nome de bloqueio diz, pode ser entendido como um recurso crítico, significa que o campo atual para adquirir um bloqueio de segmento de bloqueio todas as competições esta discussão deve ser julgado nesta chave não tem seu próprio segmento do campo, Se não, o bloqueio não pode ser obtido, se assim for, a re-entrada correspondente ao valor do campo mais 1 (vezes)

  • Unlock

    Nós ainda assumir name = anyLock, o ID thread é assumido Thread-1, Da mesma forma, podemos saber teclas [. 1] é um getName (), ou seja, as teclas [1] = anyLock, chaves [2] é getChannelName (), ou seja KEYS [ 2] = redisson_lock__channel: {anyLock}, ARGV [1] é LockPubSub.unlockMessage, isto é ARGV [1] = 0, ARGV [2] é o tempo para vivo, ARGV [3] é getLockName (ThreadID), isto é ARGV [3] = 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: thread-1, portanto, os meios de script acima: 1, para determinar se existe um lugar chamado "anyLock" de key2, se não, para o canal de transmissão de uma mensagem de que o conteúdo é transmitido 0, 1,3 e retorna, se presente, é ainda determinado campo 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: Linha-1 está presente. 4, se o campo de não existir, devolvidos vazios, se o campo está presente, o valor do campo de menos de 1,5, depois de menos completa se o valor do campo é ainda maior do que 0, retorna para 0,6, após a redução, quando o valor do campo é menor do que ou igual a 0 , em seguida, transmitir um conteúdo mensagem de difusão é 0, e retorna 1; pode adivinhar, 0 para os recursos de transmissão estão disponíveis, notificar essas threads esperando para adquirir o bloqueio de um bloqueio já está disponível

  • Wait
     private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {
            long threadId = Thread.currentThread().getId();
            Long ttl = tryAcquire(leaseTime, unit, threadId);
            // lock acquired
            if (ttl == null) {
                return;
            }
    
            RFuture<RedissonLockEntry> future = subscribe(threadId);
            if (interruptibly) {
                commandExecutor.syncSubscriptionInterrupted(future);
            } else {
                commandExecutor.syncSubscription(future);
            }
    
            try {
                while (true) {
                    ttl = tryAcquire(leaseTime, unit, threadId);
                    // lock acquired
                    if (ttl == null) {
                        break;
                    }
    
                    // waiting for message
                    if (ttl >= 0) {
                        try {
                            future.getNow().getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);
                        } catch (InterruptedException e) {
                            if (interruptibly) {
                                throw e;
                            }
                            future.getNow().getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);
                        }
                    } else {
                        if (interruptibly) {
                            future.getNow().getLatch().acquire();
                        } else {
                            future.getNow().getLatch().acquireUninterruptibly();
                        }
                    }
                }
            } finally {
                unsubscribe(future, threadId);
            }
    //        get(lockAsync(leaseTime, unit));
        }
    

    Aqui se inscrever Channel, quando os recursos estão disponíveis pode ser hora de saber, e para aproveitar, para evitar sondagem inválida e um desperdício de recursos quando os recursos estão disponíveis usando o tempo para tentar adquirir o ciclo de bloqueio, devido às múltiplas threads ao mesmo tempo para competir por recursos, por isso aqui com o semáforos, para os mesmos recursos, permitindo que apenas um segmento para adquirir um bloqueio, outros segmentos são bloqueados 

  • resumo

 

 

Publicado 11 artigos originais · ganhou elogios 0 · Visualizações 164

Acho que você gosta

Origin blog.csdn.net/sdjxgd/article/details/105200897
Recomendado
Clasificación