quarta-feira, 29 de agosto de 2018

ReadWriteLock do EJB


Um ReadWriteLock mantém um par de locksoperações associadas , uma para operações somente leitura e uma para gravação. O read lockpode ser realizado simultaneamente por vários segmentos de leitores, desde que não existam gravadores. O write locké exclusivo.
Todas as implementações de ReadWriteLock devem garantir que os efeitos de sincronização de memória das operações writeLock (conforme especificado na Lockinterface) também sejam válidos em relação ao readLock associado . Ou seja, um encadeamento que obtiver com êxito o bloqueio de leitura verá todas as atualizações feitas na liberação anterior do bloqueio de gravação.

Um bloqueio de leitura / gravação permite um nível maior de simultaneidade no acesso a dados compartilhados do que o permitido por um bloqueio de exclusão mútua. Ele explora o fato de que, embora apenas um único encadeamento por vez (um encadeamento do gravador ) possa modificar os dados compartilhados, em muitos casos, qualquer número de encadeamentos pode ler os dados simultaneamente (portanto, encadeamentos do leitor ). Em teoria, o aumento da simultaneidade permitido pelo uso de um bloqueio de leitura / gravação levará a melhorias de desempenho em relação ao uso de um bloqueio de exclusão mútua. Na prática, esse aumento na simultaneidade só será totalmente realizado em um multiprocessador, e somente se os padrões de acesso para os dados compartilhados forem adequados.

O fato de um bloqueio de leitura / gravação melhorar ou não o desempenho em relação ao uso de um bloqueio de exclusão mútua depende da freqüência com que os dados são lidos comparados à modificação, da duração das operações de leitura e gravação e da contenção dos dados. é, o número de threads que tentará ler ou gravar os dados ao mesmo tempo. Por exemplo, uma coleção que é inicialmente preenchida com dados e, posteriormente, modificada com pouca frequência, enquanto é pesquisada com frequência (como um diretório de algum tipo) é um candidato ideal para o uso de um bloqueio de leitura / gravação. No entanto, se as atualizações se tornarem frequentes, os dados passam a maior parte do tempo exclusivamente bloqueados e há pouco ou nenhum aumento na simultaneidade. Mais distante, se as operações de leitura forem muito curtas, a sobrecarga da implementação de bloqueio de leitura-gravação (que é inerentemente mais complexa que um bloqueio de exclusão mútua) pode dominar o custo de execução, particularmente porque muitas implementações de bloqueio de leitura-gravação ainda serializam todos os segmentos através de uma pequena seção de código. Por fim, apenas o perfil e a medição determinarão se o uso de um bloqueio de leitura / gravação é adequado para sua aplicação.

Embora a operação básica de um bloqueio de leitura / gravação seja direta, há muitas decisões de política que uma implementação deve tomar, o que pode afetar a eficácia do bloqueio de leitura / gravação em um determinado aplicativo. Exemplos dessas políticas incluem:

Determinar se deve conceder o bloqueio de leitura ou o bloqueio de gravação, quando os leitores e gravadores estão aguardando, no momento em que um gravador libera o bloqueio de gravação. A preferência do escritor é comum, pois espera-se que as gravações sejam curtas e pouco frequentes. A preferência do leitor é menos comum, pois pode levar a longos atrasos para uma gravação, se os leitores forem frequentes e duradouros, como esperado. Implementações justas ou "em ordem" também são possíveis.
Determinar se os leitores que solicitam o bloqueio de leitura enquanto um leitor está ativo e um gravador está aguardando, recebem o bloqueio de leitura. A preferência pelo leitor pode atrasar o autor indefinidamente, enquanto a preferência pelo gravador pode reduzir o potencial de simultaneidade.
Determinar se os bloqueios são reentrantes: um thread com o bloqueio de gravação pode readquiri-lo? Pode adquirir um bloqueio de leitura enquanto segura o bloqueio de gravação? O bloqueio de leitura é reentrante?
O bloqueio de gravação pode ser rebaixado para um bloqueio de leitura sem permitir um gravador intermediário? Um bloqueio de leitura pode ser atualizado para um bloqueio de gravação, em vez de outros leitores ou gravadores de espera?
Você deve considerar todas essas coisas ao avaliar a adequação de uma determinada implementação para sua aplicação.

Fonte: https://docs.oracle.com/javase/7

Nenhum comentário:

Postar um comentário