- PR -

Servlet の中の synchronized が複数スレッド実行される?

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/06/03
投稿数: 50
投稿日時: 2007-12-05 17:01
Servlet中のメソッドを synchronized でロックを
掛けたのですが、複数ユーザ同時に実行した際、このメソッド中の
ログを見たところ、複数ユーザが同時に実行されていることが確認されました。
Servlet の中ではsynchronizedは効かないのでしょうか?

ご教授お願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-12-05 17:08
同期化されますよ。
同期化の対象もしくはログの確認が間違っていませんか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-12-05 17:18
どのようにsynchronizedしたのかによります。
synchronizedはブロックとして
コード:
synchronized(lock) {
    // ...
}


として使うのが本質で、()に指定したlockオブジェクトが同じであるもの同士を同期します
この部分のオブジェクトが違っていれば実質的に同期されません。例えば
コード:
synchronized(new Object()) {
    // 実質的に同期されない
}


であると無意味なわけです。

これを踏まえたうえで、メソッドにsynchronizedキーワードをつけた場合に
インスタンスメソッドではthisオブジェクトで、staticメソッドでは
該当クラスのclassオブジェクトでロックされることを理解する必要があります。

さて、該当のsynchronizedは何でロックされていますか?
未記入
ベテラン
会議室デビュー日: 2005/06/03
投稿数: 50
投稿日時: 2007-12-06 09:21
ご回答ありがとうございます。
簡単に構成を書きます。

class C {
.
.
private synchronized void update()
{
// 更新処理
}
}

// Servlet内
doGet( req, res )
{
c = new C()
}

このような場合どのように同期を取ればよろしいでしょうか?
参考になるサイトもご存知あればご教授お願いします。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-12-06 09:41
nagiseさんの回答は読まれたんでしょうか…。
synchronizedに指定されたもの(メソッドではない)が単一であれば、別のスレッドが来てもブロックされるわけです。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-12-06 12:25
引用:

未記入さんの書き込み (2007-12-06 09:21) より:
class C {
private synchronized void update()



Cの<strong>同じインスタンス同士</storong>であればupdate()は同期されます。
get内でnew()して別のインスタンスを作っているのであれば、実質的には同期されません。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-12-06 17:17
こんにちは。

引用:

未記入さんの書き込み (2007-12-06 09:21) より:
このような場合どのように同期を取ればよろしいでしょうか?



手っ取り早そうなのはupdateメソッドを下記のようにするとか。
コード:
private void update() {
	synchronized (C.class) {
		// 更新処理
	}
}



ちゃんとしたいなら保護したいリソースが何なのかを明確にして、
それに対応する同期用のオブジェクトを作ってやるのが良いと思います。

#どうもsynchronizedキーワードをクリティカルセクション(コード/処理に対する排他ロック)と勘違いされている人が多いような!?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-12-06 17:32
引用:

Tdnr_Symさんの書き込み (2007-12-06 17:17) より:
#どうもsynchronizedキーワードをクリティカルセクション(コード/処理に対する排他ロック)と勘違いされている人が多いような!?



synchronizedブロックの記法から学べばいいんですが、
メソッド修飾子としてのsynchronizedから入る人が混乱するようです。
1

スキルアップ/キャリアアップ(JOB@IT)