- - PR -
Singletonクラスについて
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-04-10 10:54
こんにちわ。
かなり初歩的な質問なのかもしれませんが よろしくお願いします。 Singletonクラスはメモリ上で唯一の オブジェクトを皆で使おうという クラスだと思います。 Singletonクラスに高負荷がかかった場合 Singletonクラスの処理はシーケンシャル に行われるのでしょうか? メモリ上で一つのオブジェクトを皆が 同時で使用できるもんなのでしょうか? | ||||||||
|
投稿日時: 2003-04-10 12:50
Singletonオブジェクトを、どう使うかに依存します。 メソッドの実行や属性への参照など、オブジェクトの状態を変化させない使い方であれば、複数のスレッドから同時並行で使うことが出来ます。 これに対して、属性への書き込みなどが行われる場合は、synchronizedなどとして同期を取らないといけないため、シーケンシャルとなってしまいます。 | ||||||||
|
投稿日時: 2003-04-10 13:29
>メモリ上で一つのオブジェクトを皆が
>同時で使用できるもんなのでしょうか? #マルチスレッドプログラミングのことを理解してませんね? 基本的にServlet/JSPなんて正にこれです. >Singletonオブジェクトを、どう使うかに依存します。 >これに対して、属性への書き込みなどが行われる場合は、synchronizedなど >として同期を取らないといけないため、シーケンシャルとなってしまいます。 この辺はアルゴリズム依存です. 同時書き込みに対してさえも不要な場合はあります. | ||||||||
|
投稿日時: 2003-04-10 13:58
こんにちわ。
う、たぶん理解していなんでしょう。。 なんか単純にあるオブジェクトがあって、今はAさんが 使っているんだからBさんは使えないよ。ていう図式が 思い浮かんでしまったんです。 かなり基礎ですかね。。 とりあえずやりたいことは、EJBつかってて主キー生成 をどうするかなってことになって。 EJBでやろうとすると、めんどくさいんで一個クラス作って そいつがJDBC経由でDB(oracle)のシーケンスからID拾って こようという話になったのです。 そこでシーケンスIDを取得するクラスを普通のクラスに すると、毎回newするのもめんどうだし、だったらsingleton にするか、となったわけです。 そこで高負荷がこのクラスにかかった時並行処理できるのかな? と思っちゃったわけです。 普通のクラスであれば、要求毎にオブジェクトを生成するので 並行処理できるのは当たり前だけどsingletonでは?と。 というわけなので、singletonでいいような気がしてきました。 属性とかいじるわけではないので。 | ||||||||
|
投稿日時: 2003-04-10 15:20
悪夢を統べるもの さん
確かに。 同一オブジェクトでも異なる属性への書き込みである場合や、同じ属性の書き込みでも、その変更がアトミックである場合なら、同期がいらない場合がありえますね。 (株)ぽち さん
これだと、残念ながら動作はシーケンシャルになってしまいますね。 シーケンス使うからシーケンシャル。というダジャレじゃなくて、RDBの同じレコードに対する更新を繰り返すことになるので、RDBMSの方で排他制御がかかるためです。 ただ、Singletonにすることで毎回newするコストはかからないですし、メソッドをsynchronized宣言する必要もありませんから、まったく無意味、ということにはならないでしょうけど。 | ||||||||
|
投稿日時: 2003-04-10 17:55
>Singletonクラスはメモリ上で唯一の
>オブジェクトを皆で使おうというクラスだと思います。 「Singletonパターンは(JavaVMに対して)インスタンスがただ一つ しか存在しないことを保証するパターン」 という方がより正確だと思います. >かなり基礎ですかね。。 >とりあえずやりたいことは、EJBつかってて主キー生成 >をどうするかなってことになって。 マルチスレッドはサーバーサイドJavaでは必須の基礎知識の一つだと 思ってます. 知らないでやってると,とてつもない致命的なバグを発生させかね ないと思います.もし,知人からそういう相談を受けたならば, マルチスレッドを一から勉強することを強く勧めるでしょう. まあ,知らないでプログラムを書いていても,滅多にトラブルに ならない点がJavaの凄いところなんですけどね.C/C++だと, 知らないままマルチスレッド=プログラミングなんてまず出来ない. 知っててもデバッグで死ぬほど苦労すること請け合いです. | ||||||||
|
投稿日時: 2003-04-10 20:13
知人にSingletonでConnectionPoolみたいなクラスを作るといいよと 言ったら、JSPでScope="application"じゃいかんのか。と突っ込まれました。 たしかにWEBJavaの場合、JSPはコンテナに1つだけ常駐するんですけどね。。。 どう説明しようかな汗 | ||||||||
|
投稿日時: 2003-04-11 00:27
こんにちは。
同期が不要になる場合とは、どのような場合でしょうか? 属性に対するアトミックな書き込みであっても、複数のスレッドで共有される属性であれば、 (volatile宣言するか、synchronizedなブロックに入れるなど)何らかの同期は必要では ないでしょうか? 「Effective Java」の項目48「共有された可変データへのアクセスを同期する」を読んだ ところでは、自スレッドで行った属性の状態変化を他スレッドに(あるいは逆に他スレッド で行われた属性の状態変化を自スレッドに)確実に反映させるためには、 状態を変化させるタイミングで同期をとらざるを得ないように思うのです…。 | ||||||||
