Ao ler artigos sobre encadeamentos Java, freqüentemente noto a expressão: "encadeamento atual é o proprietário do monitor deste objeto". Eu entendi o significado: o thread tem o direito de operar no objeto. Mas estou intrigado por que usamos a frase "o monitor do objeto" em vez de "o bloqueio do objeto".
Resumindo, não sei o significado da palavra 'monitor'. A pergunta pode ser estranha e simples. Mas gostaria que alguém pudesse ajudar a resolver isso. 3k
java
multithreading
monitor
Jiafu
fonte
fonte
Respostas:
Consulte a resposta do ulmangt para links que explicam o termo "monitor" usado neste contexto. Observe que:
(Fonte: Wikipedia )
Por que usar o termo "monitorar" em vez de "bloquear"? Bem, estritamente falando, os termos significam coisas diferentes ... especialmente se você os usar da maneira que foram originalmente planejados para serem usados.
Um "bloqueio" é algo com primitivas de aquisição e liberação que mantêm certas propriedades de bloqueio; por exemplo, uso exclusivo ou gravador único / leitor múltiplo.
Um "monitor" é um mecanismo que garante que apenas um thread pode executar uma determinada seção (ou seções) de código a qualquer momento. Isso pode ser implementado usando um bloqueio (e "variáveis de condição" que permitem que os encadeamentos aguardem ou enviem notificações para outros encadeamentos de que a condição foi cumprida), mas é mais do que apenas um bloqueio. De fato, no caso do Java, o bloqueio real usado por um monitor não está diretamente acessível. (Você simplesmente não pode dizer "Object.lock ()" para evitar que outros threads o adquiram ... como você pode com um Java
Lock
instância .)Em suma, se alguém fosse pedante, "monitorar" é, na verdade, um termo melhor do que "trava" para caracterizar o que o Java está fornecendo. Mas, na prática, os dois termos são usados quase que alternadamente.
fonte
Um monitor é simplesmente um termo para um objeto cujos métodos podem ser usados com segurança em um ambiente multithread.
Há um ótimo artigo da Wikipedia sobre monitores:
http://en.wikipedia.org/wiki/Monitor_(synchronization)
Se você rolar para baixo, há até uma seção explicitamente sobre Java .
fonte
Citação de dentro da máquina virtual Java
Monitor
Fechadura
fonte
Um
synchronized
bloco ao redor de umobject
é seu monitor, que controla o bloqueio do objeto. Aqui um exemplosynchronized (object) { while (<condition does not hold>) object.wait(timeout); ... // Perform action appropriate to condition }
fonte
Mesmo que seja tarde para responder a essa pergunta, pensei em apenas acrescentar, caso seja útil.
Aqui está um bloco sincronizado de código Java dentro de um método Java não sincronizado
public void add(int value){ synchronized(this){ this.count += value; } }
No exemplo, "this" é usado, que é a instância em que o método add é chamado. Um método de instância sincronizada usa o objeto ao qual pertence como objeto de monitor.
=> Apenas um thread pode ser executado dentro de um bloco de código Java sincronizado no mesmo objeto de monitor.
fonte
A Java Virtual Machine usa monitores para oferecer suporte a multithreading. Os monitores conseguem isso por meio de dois conceitos - exclusão mútua durante a execução das threads (aqui é onde o 'bloqueio' entra em cena) e coordenação como um meio de comunicação entre threads (aqui é onde os métodos de espera e notificação do objeto entram em cena).
Ler a seguinte parte de "Inside JVM" irá esclarecer esta dúvida, é muito bem explicado aqui (Capítulo 20, Sincronização de thread) -
https://www.artima.com/insidejvm/ed2/threadsynchP.html
fonte