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.