質問

//download.eclipse:

のhttpを見て.ORG /桟橋/安定-7 /外部参照/ 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は(再び?)同期する必要がありますか?

任意の洞察力をいただき、ありがとうございます。

役に立ちましたか?

解決

同期方法「のチャット(...)」は同期(M)に対し、インスタンスオブジェクトの同期化に「M」オブジェクトに同期化 - ので、2つの異なるオブジェクトに同期化されています。基本的に、それはいくつかの他のサーブレットのオブジェクトが同時に同じメンバーのインスタンスをいじりされていないことを確認しています。

他のヒント

全体の方法が同期されると、

ロックがthisオブジェクトで得られます。しかし、同期ブロックの取得は、現在の反復で使用されているメンバーにのみロックします。

同期は異なるロックにあります。

メソッド定義でsynchronizedキーワードはthisに同期する他のコードは、メソッドに並列で実行実行できないことを意味します。

synchronized(m)スコープはmに同期する他のコードがループに並列に実行できないことを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top