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.

Foi útil?

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.

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