Справка по синхронизации в Java - PullRequest
3 голосов
/ 07 февраля 2010

глядя на http://download.eclipse.org/jetty/stable-7/xref/com/acme/ChatServlet.html, Кажется, я не понимаю, почему в синхронизированном методе должен быть блок синхронизации, например:

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;
                }
            }
        }
    }

Почему m необходимо синхронизировать (снова?), Если весь метод уже поточно-ориентирован?

Спасибо за понимание.

Ответы [ 3 ]

4 голосов
/ 07 февраля 2010

Синхронизированный метод "chat (...)" синхронизируется на своем объекте экземпляра, тогда как синхронизированный (m) синхронизируется на объекте "m" - поэтому они синхронизируются на двух разных объектах. По сути, он следит за тем, чтобы какой-то другой объект сервлета не связывался с тем же экземпляром Member в то же время.

1 голос
/ 07 февраля 2010

Когда весь метод синхронизирован, получается блокировка для объекта this. Но синхронизированный блок получает блокировку только для члена, который в данный момент используется в итерации.

0 голосов
/ 07 февраля 2010

Синхронизация на разных блокировках.

Ключевое слово synchronized в определении метода означает, что другой код, который синхронизируется на this, не может выполняться параллельно с методом.

Область действия synchronized(m) означает, что другой код, который синхронизируется на m, не может выполняться параллельно циклу.

...