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._con开发者_StackOverflowtinuation!=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.
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.
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.
精彩评论