Javaでの同期のヘルプ
-
19-09-2019 - |
質問
//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
に同期する他のコードがループに並列に実行できないことを意味します。
所属していません StackOverflow