3

查看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需要同步(再次?)?

感谢您的任何见解。

4

3 回答 3

4

同步方法“chat(...)”在它的实例对象上同步,而 synchronized(m) 在“m”对象上同步——所以它们在两个不同的对象上同步。基本上,它确保其他一些 servlet 对象不会同时与同一个 Member 实例混淆。

于 2010-02-07T05:55:16.763 回答
1

当整个方法同步时,会在this对象上获得锁。但是同步块仅在当前正在迭代中使用的成员上获得锁定。

于 2010-02-07T05:56:25.650 回答
0

同步在不同的锁上。

方法定义处的synchronized关键字意味着其他同步的代码this不能与方法并行运行。

synchronized(m)范围意味着其他同步的代码不能m与循环并行运行。

于 2010-02-07T05:57:34.590 回答