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」オブジェクトで同期します。つまり、2つの異なるオブジェクトで同期します。基本的には、他のサーブレットオブジェクトが同じ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 に答える