ajuda sincronização em Java
-
19-09-2019 - |
Pergunta
http: //download.eclipse .org / pontão / stable-7 / xref / com / Acme / ChatServlet.html , eu não parecem entender por que é preciso haver um bloco de sincronização em um método sincronizado, assim:
private synchronized void chat(HttpServletRequest request,HttpServletResponse response,String username,String message)
throws IOException
{
Map<String,Member> room=_rooms.get(request.getPathInfo());
if (room!=null)
{
// Post chat to all members
for (Member m:room.values())
{
synchronized (m)
{
m._queue.add(username); // from
m._queue.add(message); // chat
// wakeup member if polling
if (m._continuation!=null)
{
m._continuation.resume();
m._continuation=null;
}
}
}
}
Por que a necessidade m
para ser sincronizado (de novo?), Se todo o método já é thread-safe?
Obrigado por qualquer insight.
Solução
O método de "bate-papo (...)" sincronizado sincroniza, por si instância do objeto enquanto o sincronizado (m) sincroniza no objeto "m" - então eles estão sincronizando em dois objetos diferentes. Basicamente é certificando-se de que algum outro objeto servlet não está saindo com a mesma instância dos membros, ao mesmo tempo.
Outras dicas
Quando método inteiro é sincronizado o bloqueio é obtido no objecto this
. Mas os obtém bloco sincronizado bloquear apenas no membro a ser usado na iteração.
A sincronização é em diferentes fechaduras.
A palavra-chave synchronized
nos meios de definição de método que outro código que sincroniza sobre this
não pode correr correr em paralelo com o método.
Os meios de escopo synchronized(m)
que outro código que sincroniza sobre m
não pode ser executado em paralelo ao circuito.