Qual é a diferença entre a wait()
e sleep()
em Threads?
Estou entendendo que um wait()
segmento -ing ainda está no modo de execução e usa ciclos de CPU, mas um sleep()
-ing não consome nenhum ciclo de CPU correto?
Por que temos os dois wait()
e sleep()
: como a implementação deles varia em um nível inferior?
Respostas:
Um
wait
pode ser "acordado" por outro encadeamento que chamanotify
o monitor que está sendo aguardado, enquanto umsleep
não pode. Também umwait
(enotify
) deve ocorrer em um blocosynchronized
no objeto de monitor, ao passosleep
que não:Nesse ponto, o encadeamento atualmente em execução aguarda e libera o monitor . Outra discussão pode fazer
(no mesmo
mon
objeto) e o primeiro segmento (assumindo que seja o único segmento aguardando no monitor) será ativado.Você também pode ligar
notifyAll
se mais de um segmento estiver aguardando no monitor - isso ativará todos eles . No entanto, apenas um dos encadeamentos poderá agarrar o monitor (lembre-se de que elewait
está em umsynchronized
bloco) e continuar - os outros serão bloqueados até que possam adquirir o bloqueio do monitor.Outro ponto é que você chama
wait
emObject
si (ou seja, você espera no monitor de um objeto), enquanto você chamasleep
deThread
.No entanto, outro ponto é que você pode obter wakeups espúrias de
wait
(ou seja, a discussão que está esperando currículos sem razão aparente). Você deve semprewait
girar em algumas condições, como a seguir:fonte
wait
/notify
geralmente são usados para aguardar que outro segmento realize uma tarefa ou para esperar até que uma determinada condição seja satisfeita.Uma diferença importante ainda não mencionada é que, durante o sono, um Thread não libera os bloqueios que ele mantém, enquanto espera libera o bloqueio no objeto que
wait()
é chamado.fonte
sleep
contém bloqueios java , mas não. Para ter uma comparação justa, compararíamossynchronized(OUTER_LOCK){ Thread.sleep(1000); }
comsynchronized(OUTER_LOCK){ synchronized(LOCK){LOCK.wait();} }
e podemos ver que ambas as instruções não liberam oOUTER_LOCK
. Se houver alguma diferença, podemos dizer quesleep
não usa explicitamente bloqueios java , mas a pergunta é sobre a citação "como sua implementação varia em um nível inferior?" entre aspas.wait()
está associado à condição do bloqueio mais interno do qual é chamado, no seu exemplo de código,wait()
só pode ser liberadoLOCK
e nãoOUTER_LOCK
. É assim que o monitor Java é projetado de qualquer maneira. Uma comparação justa seriasynchronized(OUTER_LOCK){ synchronized(LOCK) { Thread.sleep(1000); } }
esynchronized(OUTER_LOCK){ synchronized(LOCK) { LOCK.wait(); } }
. Neste casosleep()
vai realizar ambas as fechaduras enquantowait()
lançaráLOCK
mas ainda mantêmOUTER_LOCK
Achei este post útil. Ela coloca a diferença entre
Thread.sleep()
,Thread.yield()
eObject.wait()
em termos humanos. Citar:fonte
sleep(n)
está dizendo implicitamente que o segmento em execução no momento renuncia voluntariamente ao monitor do bloqueio, o que não é verdade . Citação do javadoc do Thread : "O thread não perde a propriedade de nenhum monitor".sleep
não há nenhum comportamento especial em relação ao monitor do que qualquer outra chamada de método Java, ou seja, ele não os interage ou modifica de forma alguma. Se você disser algo sobre monitores, deverá especificar quewait
, além do que foi dito acima, renunciará temporariamente ao bloqueio no objeto em que é chamado.wait(n)
para compararsleep(n)
. Não faz sentido comparar usando o no-arg.Há muitas respostas aqui, mas não consegui encontrar a distinção semântica mencionada em nenhuma.
Não é sobre o próprio tópico; ambos os métodos são necessários, pois suportam casos de uso muito diferentes.
sleep()
envia o Thread para suspensão como antes, apenas compacta o contexto e para de executar por um tempo predefinido. Portanto, para ativá-lo antes do tempo devido, você precisa conhecer a referência do Thread. Essa não é uma situação comum em um ambiente multithread. É usado principalmente para sincronização de tempo (por exemplo, ativação em exatamente 3,5 segundos) e / ou imparcialidade codificada (apenas durma um pouco e deixe outros threads funcionarem).wait()
, pelo contrário, é um mecanismo de sincronização de encadeamento (ou mensagem) que permite notificar um encadeamento do qual você não tem referência armazenada (nem cuidado). Você pode pensar nisso como um padrão de publicação-assinatura (wait
== inscrever-se enotify()
== publicar). Basicamente, usando o notify () você está enviando uma mensagem (que pode até não ser recebida e normalmente você não se importa).Para resumir, você normalmente usa
sleep()
para sincronização de tempo e sincronização multithreadwait()
.Eles poderiam ser implementados da mesma maneira no sistema operacional subjacente ou não (como as versões anteriores do Java não tinham multithreading real; provavelmente algumas VMs pequenas também não fazem isso). Não esqueça que o Java é executado em uma VM; portanto, seu código será transformado em algo diferente de acordo com a VM / OS / HW em que ele é executado.
fonte
Aqui, listei algumas diferenças importantes entre
wait()
esleep()
métodos.PS: Clique também nos links para ver o código da biblioteca (trabalho interno, basta brincar um pouco para entender melhor).
esperar()
wait()
O método libera o bloqueio.wait()
é o método daObject
classewait()
é o método não estático -public final void wait() throws InterruptedException { //...}
wait()
deve ser notificado pornotify()
ounotifyAll()
métodos.wait()
O método precisa ser chamado de um loop para lidar com o alarme falso.wait()
O método deve ser chamado a partir do contexto sincronizado (ou seja, método ou bloco sincronizado), caso contrário, ele lançaráIllegalMonitorStateException
dormir()
sleep()
O método não libera o bloqueio.sleep()
é o método dajava.lang.Thread
classesleep()
é o método estático -public static void sleep(long millis, int nanos) throws InterruptedException { //... }
sleep()
é concluído.sleep()
melhor não ligar do loop (ou seja, veja o código abaixo ).sleep()
pode ser chamado de qualquer lugar. não há requisito específico.Ref: Diferença entre Esperar e Dormir
Snippet de código para chamar o método de espera e suspensão
fonte
Thread.sleep()
é usado para disponibilizar o tempo do processador para os outros threads. o período de sono pode ser encerrado por interrupções (ou seja, pela JVM). Leia este stackoverflow.com/questions/4264355/…notify()
ounotifyAll()
sãoObject
métodos de classe. portanto, eles estarão disponíveis com obj de toda classe (ou seja, aqui também comThread
classe). consulte o código grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…Existem algumas notas importantes que concluo depois de trabalhar em esperar e dormir, primeiro dê uma olhada na amostra usando wait () e sleep ():
Exemplo1 : usando wait () e sleep ():
Vamos esclarecer algumas notas principais:
Por favor me corrija se eu estiver errado.
fonte
Diferença entre wait () e sleep ()
A diferença fundamental é que
wait()
éObject
esleep()
é um método estático deThread
.A principal diferença é que
wait()
libera o bloqueio enquantosleep()
não libera nenhum bloqueio enquanto aguarda.wait()
é usado para comunicação entre threads enquantosleep()
é usado para introduzir uma pausa na execução, geralmente.wait()
deve ser chamado de dentro de sincronizar ou então temos umIllegalMonitorStateException
, enquantosleep()
pode ser chamado em qualquer lugar.wait()
, você precisa chamarnotify()
ounotifyAll()
. Quantosleep(),
ao encadeamento, é iniciado após um intervalo de tempo especificado.Semelhanças
fonte
Essa é uma pergunta muito simples, porque esses dois métodos têm um uso totalmente diferente.
A principal diferença é esperar para liberar a trava ou monitor enquanto o sono não libera nenhuma trava ou monitor enquanto aguarda. A espera é usada para comunicação entre encadeamentos enquanto a suspensão é usada para introduzir uma pausa na execução.
Esta foi apenas uma explicação clara e básica, se você quiser mais do que isso, continue lendo.
No caso de o
wait()
thread do método entrar no estado de espera e ele não voltará automaticamente até chamarmos onotify()
método (ounotifyAll()
se você tiver mais de um thread no estado de espera e desejar ativar todos esses threads). E você precisa sincronizado ou o bloqueio objeto ou bloqueio classe para acesso await()
ounotify()
ounotifyAll()
métodos. E mais uma coisa, owait()
método é usado para comunicação entre segmentos, porque se um segmento entrar no estado de espera, você precisará de outro segmento para ativar esse segmento.Mas, nesse caso,
sleep()
é um método usado para manter o processo por alguns segundos ou o tempo que você deseja. Porque você não precisa de provocar qualquernotify()
ounotifyAll()
método para obter isso de volta fio. Ou você não precisa de nenhum outro segmento para retornar esse segmento. Por exemplo, se você deseja que algo aconteça após alguns segundos, como em um jogo após a vez do usuário, você deseja que o usuário espere até que o computador seja reproduzido. Você pode mencionar osleep()
métodoE mais uma diferença importante que é frequentemente solicitada nas entrevistas:
sleep()
pertence àThread
classe ewait()
pertence àObject
classe.Essas são todas as diferenças entre
sleep()
ewait()
.E há uma semelhança entre os dois métodos: ambos são instruções verificadas, então você precisa tentar pegar ou lançar para acessar esses métodos.
Eu espero que isso te ajude.
fonte
fonte: http://www.jguru.com/faq/view.jsp?EID=47127
fonte
Esperar e dormir são duas coisas diferentes:
sleep()
segmento, pára de funcionar pela duração especificada.wait()
thread, ele pára de funcionar até que o objeto que está sendo aguardado seja notificado, geralmente por outros threads.fonte
sleep
, use-o , se desejar que ele pare até que alguma entrada venha da outra que você usawait
/notify
.interrupt
destina-se a uma maneira de sinalizar um thread que ele deve parar de fazer o que está fazendo e terminar. É tratado porsleep
,wait
mas também bloqueando funções de E / S (e você pode implementar funções com o mesmo comportamento chamando o métodoThread.interrupted()
). Quanto ao desempenho, as funções geralmente são otimizadas para o objetivo em que foram projetadas.sleep
é um método deThread
,wait
é um método deObject
, assimwait/notify
como uma técnica de sincronização de dados compartilhados em Java (usando o monitor ), massleep
é um método simples de encadeamento para pausar a si próprio.fonte
sleep () é um método usado para reter o processo por alguns segundos ou o tempo desejado, mas em caso de wait () o encadeamento do método fica em estado de espera e não volta automaticamente até que chamemos o notify () ou notifyAll ().
A principal diferença é que wait () libera o bloqueio ou monitor enquanto o modo sleep () não libera nenhum bloqueio ou monitor enquanto aguarda. A espera é usada para comunicação entre encadeamentos, enquanto a suspensão é usada para introduzir uma pausa na execução, geralmente.
Thread.sleep () envia o thread atual para o estado “Não pode ser executado” por algum tempo. O thread mantém os monitores que adquiriu - ou seja, se o thread estiver atualmente em um bloco ou método sincronizado, nenhum outro thread poderá entrar nesse bloco ou método. Se outro thread chamar t.interrupt (), ele ativará o thread inativo. Observe que sleep é um método estático, o que significa que sempre afeta o encadeamento atual (aquele que está executando o método sleep). Um erro comum é chamar t.sleep () onde t é um encadeamento diferente; mesmo assim, é o encadeamento atual que dorme, não o encadeamento t.
object.wait () envia o encadeamento atual para o estado “Não executável”, como sleep (), mas com um toque. A espera é chamada em um objeto, não em um encadeamento; chamamos esse objeto de "objeto de bloqueio". Antes de lock.wait () ser chamado, o encadeamento atual deve ser sincronizado no objeto lock; wait () libera esse bloqueio e adiciona o thread à "lista de espera" associada ao bloqueio. Posteriormente, outro encadeamento pode ser sincronizado no mesmo objeto de bloqueio e chamar lock.notify (). Isso ativa o thread original em espera. Basicamente, wait () / notify () é semelhante a sleep () / interrupt (), apenas o encadeamento ativo não precisa de um ponteiro direto para o encadeamento adormecido, mas apenas para o objeto de bloqueio compartilhado.
Vamos categorizar todos os pontos acima:
Call on:
Synchronized:
Hold lock:
Wake-up condition:
Usage:
Ref: diff
sleep
ewait
fonte
Em palavras simples, wait is wait Até que outro thread o chame, enquanto sleep é "não execute a próxima instrução" por um período especificado.
Além disso, sleep é um método estático na classe Thread e opera em thread, enquanto wait () está na classe Object e é chamado em um objeto.
Outro ponto, quando você chama wait em algum objeto, o thread envolvido sincroniza o objeto e aguarda. :)
fonte
wait
esleep
métodos são muito diferentes:sleep
não tem como "acordar",wait
tem uma maneira de "acordar" durante o período de espera, por outro thread chamandonotify
ounotifyAll
.Venha para pensar sobre isso, os nomes são confusos a esse respeito; no entanto,
sleep
é um nome padrão ewait
é como oWaitForSingleObject
ouWaitForMultipleObjects
na API do Win.fonte
Deste post: http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/
Método wait ().
1) O thread que chama o método wait () libera o bloqueio que ele mantém.
2) O encadeamento recupera o bloqueio depois que outros encadeamentos chamam os métodos notify () ou notifyAll () no mesmo bloqueio.
3) O método wait () deve ser chamado dentro do bloco sincronizado.
4) O método wait () é sempre chamado em objetos.
5) Os threads em espera podem ser ativados por outros threads chamando os métodos notify () ou notifyAll ().
6) Para chamar o método wait (), o encadeamento deve ter um bloqueio de objeto.
Método sleep ()
1) O thread que chama o método sleep () não libera o bloqueio que ele mantém.
2) o método sleep () pode ser chamado dentro ou fora do bloco sincronizado.
3) o método sleep () é sempre chamado em threads.
4) Os threads adormecidos não podem ser despertados por outros threads. Se feito, o thread lançará InterruptedException.
5) Para chamar o método sleep (), o thread não precisa ter um bloqueio de objeto.
fonte
Aqui, wait () estará no estado de espera até ser notificado por outro Thread, mas onde o sleep () estará demorando algum tempo .. depois que ele será transferido automaticamente para o estado Ready ...
fonte
wait()
é um método deObject
classe.sleep()
é um método deThread
classe.sleep()
permite que o encadeamento vá para osleep
estado por x milissegundos.Quando um thread entra no estado de suspensão
it doesn’t release the lock
.wait()
permite que a linha solte a trava egoes to suspended state
.Esse encadeamento estará ativo quando um método
notify()
ounotifAll()
for chamado para o mesmo objeto.fonte
Uma grande diferença potencial entre suspensão / interrupção e espera / notificação é que
interrupt()
durantesleep()
sempre lança uma exceção (por exemplo, InterruptedException ), enquantonotify()
durantewait()
não.Gerar uma exceção quando não é necessário é ineficiente. Se você tiver threads se comunicando a uma taxa alta, isso geraria muitas exceções se você estivesse chamando interrupção o tempo todo, o que é um total desperdício de CPU.
fonte
Você está correto - Sleep () faz com que esse thread "entre em suspensão" e a CPU apaga e processa outros threads (também conhecidos como alternância de contexto), onde acredito que Wait mantém a CPU processando o thread atual.
Temos os dois porque, embora possa parecer sensato permitir que outras pessoas usem a CPU enquanto você não a estiver usando, na verdade há uma sobrecarga na alternância de contexto - dependendo de quanto tempo durar, pode ser mais caro nos ciclos da CPU para alternar threads do que simplesmente fazer com que seu thread não faça nada por alguns ms.
Observe também que o sono força uma troca de contexto.
Além disso - em geral, não é possível controlar a alternância de contexto - durante a espera que o sistema operacional possa (e espere por mais tempo) optar por processar outros threads.
fonte
interrupt
. A hora de término én
nowait(n)
. ¶¶ Faz 8 anos e ainda ninguém tem a resposta!Os métodos são usados para coisas diferentes.
Thread.sleep (n) pode ser interrompido, mas Object.wait () deve ser notificado. É possível especificar o tempo máximo de espera:
Object.wait(5000)
para que seja possível usarwait
, er,sleep
mas é preciso se preocupar com bloqueios.Nenhum dos métodos usa a CPU enquanto dorme / espera.
Os métodos são implementados usando código nativo, usando construções semelhantes, mas não da mesma maneira.
Procure você mesmo: O código fonte dos métodos nativos está disponível? O arquivo
/src/share/vm/prims/jvm.cpp
é o ponto de partida ...fonte
Thread.sleep(big_num)
deve ser interrompido.Object.wait(small_num)
pode ser notificado.Aguarde () e durma () Diferenças?
Thread.sleep () Quando o trabalho é concluído, apenas libera a trava para todos. até que nunca libere a trava para ninguém.
Object.wait () Quando estiver indo para o estágio de espera, ele liberará a chave e estará aguardando alguns dos segundos com base no parâmetro.
Por exemplo:
você está tomando o café na sua mão direita, você pode pegar outra pessoa da mesma mão; quando você pousa, então pega outro objeto do mesmo tipo aqui. Além disso. isto é sono () você dorme tempo que você não fez nenhum trabalho, você está dormindo apenas .. o mesmo aqui também.
esperar(). quando você é colocado no chão e assume outra, enquanto espera, isso é esperar
você reproduz filme ou qualquer coisa em seu sistema, assim como o reprodutor, não pode reproduzir mais de um de cada vez, é aqui, quando você fecha e escolhe outro filme ou música de alguém enquanto é chamado de espera
fonte
wait
libera a fechadura esleep
não. Um segmento em estado de espera é elegível para acordar logonotify
ounotifyAll
é chamado. No entanto, no caso desleep
o thread manter a trava, ele só será elegível quando o tempo de suspensão terminar.fonte
InterruptedException
é lançado, como diz o Javadoc.sleep()
O método faz com que o encadeamento atual passe do estado de execução para o estado do bloco por um tempo especificado. Se o encadeamento atual tiver o bloqueio de qualquer objeto, ele continuará mantendo-o, o que significa que outros encadeamentos não podem executar nenhum método sincronizado nesse objeto de classe.wait()
O método faz com que o encadeamento atual entre no estado do bloco por um tempo especificado ou até ser notificado, mas nesse caso, o encadeamento libera o bloqueio do objeto (o que significa que outros encadeamentos podem executar qualquer método sincronizado do objeto de chamada.fonte
Na minha opinião, a principal diferença entre os dois mecanismos é que dormir / interromper é a maneira mais básica de lidar com threads, enquanto esperar / notificar é uma abstração destinada a facilitar a intercomunicação de threads. Isso significa que dormir / interromper pode fazer qualquer coisa, mas que essa tarefa específica é mais difícil de fazer.
Por que esperar / notificar é mais adequado? Aqui estão algumas considerações pessoais:
Força a centralização. Permite coordenar a comunicação entre um grupo de threads com um único objeto compartilhado. Isso simplifica muito o trabalho.
Força a sincronização. Porque faz com que o programador encerre a chamada para aguardar / notificar em um bloco sincronizado.
É independente da origem e número do encadeamento. Com essa abordagem, você pode adicionar mais threads arbitrariamente, sem editar os outros tópicos ou acompanhar os existentes. Se você usou suspensão / interrupção, primeiro você precisa manter as referências aos segmentos em suspensão e depois interrompê-los um a um, manualmente.
Um exemplo da vida real que é bom para explicar isso é um restaurante clássico e o método que o pessoal usa para se comunicar entre eles: os garçons deixam os pedidos do cliente em um local central (uma placa de cortiça, uma mesa etc.), tocam uma campainha e os trabalhadores da cozinha vêm atender a esses pedidos. Quando o curso estiver pronto, o pessoal da cozinha tocará novamente a campainha para que os garçons estejam cientes e os levem aos clientes.
fonte
Exemplo sobre suspensão não libera bloqueio e espera faz
Aqui existem duas classes:
Singleton : Esta é a classe singleton com dois métodos estáticos getInstance () e getInstance (boolean isWait).
e
Agora, execute este exemplo, você obterá abaixo da saída:
Aqui, as instâncias Singleton criadas por threadA e threadB são iguais. Isso significa que o threadB está esperando do lado de fora até o threadA liberar seu bloqueio.
Agora mude o Singleton.java comentando Thread.sleep (500); método e descomentando Singleton.class.wait (500); . Aqui por causa de Singleton.class.wait (500); O método threadA libera todos os bloqueios adquiridos e passa para o estado "Não executável", o threadB recebe alterações para inserir no bloco sincronizado.
Agora execute novamente:
Aqui, as instâncias Singleton criadas por threadA e threadB NÃO são iguais devido ao threadB ter alterado para entrar no bloco sincronizado e, após 500 milissegundos, o threadA iniciou sua última posição e criou mais um objeto Singleton.
fonte
Deve ser chamado a partir do bloco sincronizado: o
wait()
método é sempre chamado a partir do bloco sincronizado, ou seja, owait()
método precisa bloquear o monitor do objeto antes do objeto no qual é chamado. Mas osleep()
método pode ser chamado de fora do bloco sincronizado, isto é,sleep()
método não precisa de nenhum monitor de objeto.IllegalMonitorStateException: se o
wait()
método for chamado sem adquirir o bloqueio do objeto,IllegalMonitorStateException
será lançado no tempo de execução, massleep()
método nunca lança essa exceção.Pertence a qual classe: o
wait()
método pertence àjava.lang.Object
classe, mas osleep()
método pertence àjava.lang.Thread
classe.Chamado a objeto ou thread: o
wait()
método é chamado em objetos, mas osleep()
método é chamado em Threads, não objetos.Estado do
wait()
encadeamento : quando o método é chamado no objeto, o encadeamento que retinha o monitor do objeto passa do estado de execução para o estado de espera e pode retornar ao estado executável somente quandonotify()
ou onotifyAll()
método é chamado nesse objeto. E posteriormente, o agendador de encadeamentos agenda esse encadeamento para passar do estado executável para o estado de execução. Quandosleep()
é chamado no encadeamento, ele passa da execução para o estado em espera e pode retornar ao estado executável quando o tempo de suspensão termina.Quando chamado do bloco sincronizado: quando o
wait()
método é chamado thread, sai do objeto lock. Mas osleep()
método quando chamado do bloco sincronizado ou do thread do método não deixa o objeto bloqueado.Para mais referência
fonte
Na página de documentação da Oracle no método wait () de
Object
:notify()
método ou onotifyAll()
método para este objeto. Em outras palavras, esse método se comporta exatamente como se simplesmente executasse a chamadawait(0)
.Este método lança
IllegalMonitorStateException
- se o encadeamento atual não for o proprietário do monitor do objeto.InterruptedException
- se algum encadeamento interrompeu o encadeamento atual antes ou enquanto o encadeamento atual aguardava uma notificação. O status interrompido do encadeamento atual é limpo quando essa exceção é lançada.Na página de documentação da oracle, no método sleep () da
Thread
classe:Este método lança:
IllegalArgumentException
- se o valor de milis for negativoInterruptedException
- se algum segmento interrompeu o segmento atual. O status interrompido do encadeamento atual é limpo quando essa exceção é lançada.Outra diferença importante:
wait()
é um método não estático (método de instância), diferentemente do método estáticosleep()
(método de classe).fonte
wait()
é dado dentro de um método sincronizado ao passo quesleep()
é dado dentro de um método não sincronizada porquewait()
método libertar o bloqueio sobre o objecto, massleep()
ouyield()
faz libertar alock()
.fonte
sleep()
pode estar dentro de umsynchronized
bloco ou método. A resposta não explica nada.wait(1000)
faz com que o encadeamento atual durma até um segundo .notify()
ou donotifyAll()
método.sleep(1000)
faz com que o encadeamento atual entre em repouso por exatamente 1 segundo .fonte
sleep(1000)
não garante dormir por exatamente 1 segundo. Pode ser interrompido antes.Na verdade, tudo isso está claramente descrito nos documentos Java (mas percebi isso apenas depois de ler as respostas).
http://docs.oracle.com/javase/8/docs/api/index.html :
wait () - O encadeamento atual deve possuir o monitor desse objeto. O encadeamento libera a propriedade desse monitor e aguarda até que outro encadeamento notifique os encadeamentos que aguardam no monitor desse objeto para ativar por meio de uma chamada ao método de notificação ou pelo método notifyAll. O encadeamento então espera até que possa obter novamente a propriedade do monitor e retoma a execução.
sleep () - Faz com que o encadeamento atualmente em execução seja interrompido (interrompa temporariamente a execução) pelo número especificado de milissegundos, sujeito à precisão e exatidão dos cronômetros e planejadores do sistema. O encadeamento não perde a propriedade de nenhum monitor.
fonte