O que é um monitor em Java?


129

O que é um monitor referido na programação simultânea em Java?

Quando li que "todo objeto associou um monitor", o que isso significa?

É um objeto especial?


11
+1 Isso me fez ler como os monitores são implementados no nível da JVM. Aprendi algo novo
naikus

@naikus Espero detalhes de compartilhamento de formar você :)
roottraveller

Respostas:


89

Um monitor é um mecanismo para controlar o acesso simultâneo a um objeto.

Isso permite que você faça:

Tópico 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

Tópico 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

Isso impede que os segmentos 1 e 2 acessem a seção monitorada (sincronizada) ao mesmo tempo. Um será iniciado e o monitor impedirá que o outro acesse a região antes que o primeiro termine.

Não é um objeto especial. É do mecanismo de sincronização colocados a classe hierarquia raiz: java.lang.Object.

Há também waite notifymétodos que também vai usar o Monitor do objeto para a comunicação entre os diferentes tópicos.


1
então, podemos dizer que, quando criamos um método sincronizado, estamos definindo um bloqueio (monitor) no método desse objeto?
Xdevel2000

28
Erm, não exatamente. Cada objeto possui automaticamente um monitor (mutex) associado, independentemente de qualquer outra coisa. Quando você declara um método sincronizado, declara que o tempo de execução deve obter o bloqueio no monitor do objeto antes que a execução desse método comece (e deve liberar o bloqueio antes que o controle retorne ao código de chamada).
Andrzej Doyle

31
E @ Pablo - não existe monitor para um método; Os monitores existem apenas para objetos, que seria a instância anexa para a maioria dos métodos ou o Classobjeto correspondente para métodos estáticos. Se você já possui um método sincronizado1 () e declara o método2 () sincronizado, nenhum novo monitor é criado e, na verdade, a invocação de qualquer método (no mesmo objeto) tentará bloquear o mesmo monitor. Isso geralmente chama a atenção dos recém-chegados.
Andrzej Doyle

1
@ Andrzej: então, todo objeto tem UM monitor associado a ele. Então eu posso ter muitos métodos sincronizados. Depois que, sempre que um desses métodos é chamado, um thread obtém o monitor que faz as coisas de sincronização.
Xdevel2000

1
só preciso esclarecer isso ... o objeto que é usado para chamar um bloco sincronizado no segmento 1 pode ser usado novamente em outro segmento (segmento 2) para chamar o método normal (não sincronizado) ao mesmo tempo?

26

Um monitor é uma entidade que possui um bloqueio e um conjunto de espera . Em Java, qualquer um Objectpode servir como um monitor.

Para uma explicação detalhada de como os monitores funcionam em Java, recomendo a leitura da seção Mecânica do Monitor da Programação Simultânea em Java (o link anterior exibe a visualização nos livros do Google, e essa seção está disponível para leitura).


Como você disse "Um monitor é uma entidade ..", significa monitor é um objeto / estado interno que possui / rastreia o bloqueio e o conjunto de espera? Caso contrário, você pode elaborar a Entidade aqui? Basicamente, quando java doc diz Wakes up all threads that are waiting on this object's monitor. sobre notifyall (), o que eu recebo é que o objeto está mantendo (com a ajuda da entidade / objeto interno) o que todos os threads estão esperando pelo bloqueio, essa entidade / objeto interno é chamado de monitor?
User3198603

Resposta mais útil. Obrigado @JRL.
gravetii 25/05

Para mim, diz: "Não há visualização disponível para esta página."
opncow 04/02/19

9
  1. Um monitor é um conceito / mecanismo que não se limita à linguagem Java;
  2. "Na programação simultânea, um monitor é um objeto ou módulo destinado a ser usado com segurança por mais de um thread";
  3. Como todo leitor sabe, todo objeto em Java é uma subclasse de java.lang.Object. O pessoal do java criou o java.lang.Object de forma a ter recursos e características que permitem aos programadores Java usar qualquer objeto como monitor. Por exemplo, todo objeto tem uma fila de espera, uma fila de reentrada e os métodos de espera e notificação para torná-lo um monitor;
  4. leia sobre monitores aqui .

4

A linguagem Java e o sistema de tempo de execução suportam a sincronização de threads através do uso de monitores.
Um monitor está associado a um item de dados específico (uma variável de condição) e funciona como um bloqueio nesses dados. Quando um segmento retém o monitor para algum item de dados, outros segmentos são bloqueados e não podem inspecionar ou modificar os dados.



2

Monitor é uma construção de sincronização que permite que os threads tenham exclusão mútua e a capacidade de aguardar (bloquear) que uma determinada condição se torne verdadeira.

Os monitores também têm um mecanismo para sinalizar para outros segmentos que suas condições foram atendidas. É uma entidade que possui um bloqueio e um conjunto de espera. Em Java, qualquer objeto pode servir como um monitor.

Na máquina virtual Java, todos os objetos e classes são associados logicamente a um monitor. Para implementar o recurso de exclusão mútua de monitores, um bloqueio (às vezes chamado de mutex) é associado a cada objeto e classe. Isso é chamado de semáforo em termos de sistemas operacionais, mutex é um semáforo binário.

Para mais informações, consulte o link


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.