- - PR -
Servlet の中の synchronized が複数スレッド実行される?
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-12-05 17:01
Servlet中のメソッドを synchronized でロックを
掛けたのですが、複数ユーザ同時に実行した際、このメソッド中の ログを見たところ、複数ユーザが同時に実行されていることが確認されました。 Servlet の中ではsynchronizedは効かないのでしょうか? ご教授お願いします。 | ||||||||
|
投稿日時: 2007-12-05 17:08
同期化されますよ。
同期化の対象もしくはログの確認が間違っていませんか? | ||||||||
|
投稿日時: 2007-12-05 17:18
どのようにsynchronizedしたのかによります。
synchronizedはブロックとして
として使うのが本質で、()に指定したlockオブジェクトが同じであるもの同士を同期します。 この部分のオブジェクトが違っていれば実質的に同期されません。例えば
であると無意味なわけです。 これを踏まえたうえで、メソッドにsynchronizedキーワードをつけた場合に インスタンスメソッドではthisオブジェクトで、staticメソッドでは 該当クラスのclassオブジェクトでロックされることを理解する必要があります。 さて、該当のsynchronizedは何でロックされていますか? | ||||||||
|
投稿日時: 2007-12-06 09:21
ご回答ありがとうございます。
簡単に構成を書きます。 class C { . . private synchronized void update() { // 更新処理 } } // Servlet内 doGet( req, res ) { c = new C() } このような場合どのように同期を取ればよろしいでしょうか? 参考になるサイトもご存知あればご教授お願いします。 | ||||||||
|
投稿日時: 2007-12-06 09:41
nagiseさんの回答は読まれたんでしょうか…。
synchronizedに指定されたもの(メソッドではない)が単一であれば、別のスレッドが来てもブロックされるわけです。 | ||||||||
|
投稿日時: 2007-12-06 12:25
Cの<strong>同じインスタンス同士</storong>であればupdate()は同期されます。 get内でnew()して別のインスタンスを作っているのであれば、実質的には同期されません。 | ||||||||
|
投稿日時: 2007-12-06 17:17
こんにちは。
手っ取り早そうなのはupdateメソッドを下記のようにするとか。
ちゃんとしたいなら保護したいリソースが何なのかを明確にして、 それに対応する同期用のオブジェクトを作ってやるのが良いと思います。 #どうもsynchronizedキーワードをクリティカルセクション(コード/処理に対する排他ロック)と勘違いされている人が多いような!? | ||||||||
|
投稿日時: 2007-12-06 17:32
synchronizedブロックの記法から学べばいいんですが、 メソッド修飾子としてのsynchronizedから入る人が混乱するようです。 |
1