De acordo com a wikipedia,
Os bloqueios compartilhados às vezes são chamados de "bloqueios de leitura" e os bloqueios exclusivos às vezes são chamados de "bloqueios de gravação".
Você pode explicar o raciocínio por trás dos termos "compartilhado" e "exclusivo"?
Respostas:
Anotei esta resposta porque pensei que seria uma analogia divertida (e adequada):
Pense em um objeto com chave como um quadro - negro (com chave) em uma sala de aula contendo um professor (escritor) e muitos alunos (leitores).
Enquanto um professor está escrevendo algo (cadeado exclusivo) no quadro:
Ninguém pode ler, porque ainda está sendo escrito e está bloqueando sua visualização => Se um objeto estiver bloqueado exclusivamente, bloqueios compartilhados não podem ser obtidos .
Outros professores também não vão subir e começar a escrever, ou o quadro torna-se ilegível e confunde os alunos => Se um objeto estiver bloqueado exclusivamente, outros bloqueios exclusivos não podem ser obtidos .
Quando os alunos estão lendo (bloqueios compartilhados) o que está no quadro:
Todos eles podem ler o que está nele, juntos => Vários bloqueios compartilhados podem coexistir .
A professora espera que eles terminem de ler antes de limpar o quadro para escrever mais => Se um ou mais bloqueios compartilhados já existem, bloqueios exclusivos não podem ser obtidos .
fonte
lock()
chamadas subsequentes após o primeiro retornará imediatamente e com sucesso. ou seja, você pode bloquear com êxito algo que já possui.writer
terá preferência sobre os leitores em espera quando o bloqueio escolher quem obterá o bloqueio em seguida (quando ele for desbloqueado pelo seu proprietário atual). Isso é sobre política .É muito simples. Os bloqueios de leitura também são conhecidos como bloqueios compartilhados porque mais de um processo pode ler ao mesmo tempo. O objetivo de um bloqueio de leitura é evitar a aquisição de um bloqueio de gravação por outro processo. Por outro lado, um bloqueio de gravação inibe todas as outras operações enquanto uma operação de gravação é concluída, por isso é descrita como exclusiva.
Portanto, um bloqueio de leitura diz "você pode ler agora, mas se quiser escrever, terá que esperar", enquanto um bloqueio de gravação diz "você terá que esperar".
Sei que você está pesquisando para apoiar seus estudos, mas não consigo resistir à vontade de dar uma palestra.
O uso incompetente de travamento é a principal causa de dores de cabeça de desempenho. O uso de um sistema de bloqueio que diferencia os bloqueios de leitura e gravação é um bom começo, mas o design cuidadoso pode, às vezes, eliminar grande parte da necessidade de bloqueio. Por exemplo, o estado da sessão nunca deve ser mantido em uma coleção global por elemento de estado.
Eu realmente vi isso ser feito. É um design atroz, causando boxe e uma mudança em uma coleção para cada última mudança no estado da sessão, acarretando um bloqueio de gravação prolongado. As despesas gerais estavam prejudicando, reduzindo efetivamente o servidor a um comportamento de thread único.
Simplesmente agregar todo o estado da sessão em uma estrutura foi uma grande melhoria. Mudanças no estado da sessão simplesmente mudaram os valores dos membros de uma estrutura de estado da sessão. Como nenhuma outra sessão teve ocasião ou mesmo oportunidade de fazer referência direta ao estado de uma sessão, a única coleção sendo atualizada foi a lista de sessões. Como resultado, o bloqueio era completamente desnecessário durante uma sessão, apenas no início e no final, e a taxa de transferência aumentou por um fator de 3.000.
O outro cenário de bloqueio comum são recursos compartilhados entre threads de um aplicativo de usuário. A maioria das estruturas modernas trata disso usando mensagens em vez de bloqueios; quando você "faz a transição para o thread de interface do usuário", está na verdade enfileirando uma mensagem contendo um ponteiro de função e alguns parâmetros (ou um delegado e um quadro de pilha dependendo da implementação).
fonte
Um bloqueio exclusivo ou de gravação dá a um processo acesso exclusivo para gravar na parte especificada do arquivo. Enquanto um bloqueio de gravação estiver em vigor, nenhum outro processo pode bloquear essa parte do arquivo.
Um bloqueio compartilhado ou de leitura proíbe qualquer outro processo de solicitar um bloqueio de gravação na parte especificada do arquivo. No entanto, outros processos podem solicitar bloqueios de leitura.
Mais sobre isso: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html
fonte
Princípio mesmo no lado do banco de dados. De acordo com a documentação Oracle
O modo de bloqueio exclusivo evita que o recurso associado seja compartilhado. Este modo de bloqueio é obtido para modificar dados. A primeira transação a bloquear um recurso exclusivamente é a única transação que pode alterar o recurso até que o bloqueio exclusivo seja liberado.
O modo de bloqueio de compartilhamento permite que o recurso associado seja compartilhado, dependendo das operações envolvidas. Vários usuários lendo dados podem compartilhar os dados, mantendo bloqueios de compartilhamento para evitar o acesso simultâneo por um gravador (que precisa de um bloqueio exclusivo). Várias transações podem
adquirir bloqueios de compartilhamento no mesmo recurso.
fonte