Pergunta

O Java 6 API questão.Faz chamada LockSupport.unpark(thread) ter um acontece-antes de relação ao retorno do LockSupport.park nos unparked thread?Eu fortemente suspeito de que a resposta é sim, mas o Javadoc não parece de mencioná-lo explicitamente.

Foi útil?

Solução

Eu olhei pelo código JDK e parece que os métodos de suporte do Locks são normalmente chamados fora dos blocos de sincronização. Portanto, sua suposição parece estar correta.

Outras dicas

Eu encontrei esta pergunta, porque eu estava me perguntando a mesma coisa.De acordo com a este artigo pela Oracle pesquisador David Dados, a resposta parece ser nenhum.Aqui está a parte correspondente do artigo:

Se um thread está bloqueada no park() nós garantimos que a uma subsequente unpark() vai torná-lo pronto.Perfeitamente legal, mas de baixa qualidade implementação de park() e unpark() seria métodos vazios, em que o programa degenera ao simples girar. Um no fato de que o teste decisivo para corrigir park()-unpark() o uso.

Vazio park() e unpark() métodos não confere a você qualquer acontece-antes de relação de garantias, portanto, para o seu programa para ser 100% portátil, você não deve confiar neles.

Então, novamente, o Javadoc da LockSupport diz:

Esses métodos são projetados para serem utilizados como ferramentas para a criação de de nível superior utilitários de sincronização, e não são em si mesmos útil para o controle de concorrência aplicações.O park o método é projetado para uso somente em construções de formulário:

while (!canProceed()) { ... LockSupport.park(this); }

Desde que você tem que explicitamente verifique alguma condição de qualquer maneira, que irá envolver volatile ou devidamente sincronizados variáveis, fracos garantias de park() na verdade, não deve ser um problema, certo?

Se não estiver documentado como tal, você não pode confiar nele criando um relacionamento antes do relacionamento.

Especificamente LockSupport.java no código de hotspot simplesmente chama inseguro.park e .unpark!

o acontece antes O relacionamento geralmente vem de um par de leitura de gravação em um sinalizador de status volátil ou algo semelhante.

Lembre -se, se não estiver documentado como criação de um acontece antes relacionamento então você devo Trate -o como se não tivesse, mesmo que você possa provar que faz no seu sistema específico. Sistemas e implementações futuros podem não. Eles se deixaram essa liberdade por uma boa razão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top