Question

looking at http://download.eclipse.org/jetty/stable-7/xref/com/acme/ChatServlet.html, I don't seem to understand why there needs to be a synchronization block in a synchronized method, like so:

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

Why does m need to be synchronized (again?) if the whole method is already thread-safe?

Thank you for any insight.

Was it helpful?

Solution

The synchronized method "chat(...)" synchronizes on it's instance object whereas the synchronized(m) synchronizes on the "m" object - so they are synchronizing on two different objects. Basically it's making sure that some other servlet object isn't messing with the same Member instance at the same time.

OTHER TIPS

When whole method is synchronized the lock is obtained on the this object. But the synchronized block obtains lock only on the member currently being used in iteration.

The synchronization is on different locks.

The synchronized keyword at the method definition means that other code that synchronizes on this cannot run run in parallel to the method.

The synchronized(m) scope means that other code that synchronizes on m cannot run in parallel to the loop.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top