- PR -

Singletonクラスについて

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2003-04-10 10:54
こんにちわ。

かなり初歩的な質問なのかもしれませんが
よろしくお願いします。

Singletonクラスはメモリ上で唯一の
オブジェクトを皆で使おうという
クラスだと思います。

Singletonクラスに高負荷がかかった場合
Singletonクラスの処理はシーケンシャル
に行われるのでしょうか?

メモリ上で一つのオブジェクトを皆が
同時で使用できるもんなのでしょうか?

へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2003-04-10 12:50
引用:

メモリ上で一つのオブジェクトを皆が
同時で使用できるもんなのでしょうか?


Singletonオブジェクトを、どう使うかに依存します。
メソッドの実行や属性への参照など、オブジェクトの状態を変化させない使い方であれば、複数のスレッドから同時並行で使うことが出来ます。
これに対して、属性への書き込みなどが行われる場合は、synchronizedなどとして同期を取らないといけないため、シーケンシャルとなってしまいます。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-04-10 13:29
>メモリ上で一つのオブジェクトを皆が
>同時で使用できるもんなのでしょうか?
#マルチスレッドプログラミングのことを理解してませんね?
基本的にServlet/JSPなんて正にこれです.

>Singletonオブジェクトを、どう使うかに依存します。

>これに対して、属性への書き込みなどが行われる場合は、synchronizedなど
>として同期を取らないといけないため、シーケンシャルとなってしまいます。
この辺はアルゴリズム依存です.
同時書き込みに対してさえも不要な場合はあります.
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2003-04-10 13:58
こんにちわ。

引用:

悪夢を統べるものさんの書き込み (2003-04-10 13:29) より:
>メモリ上で一つのオブジェクトを皆が
>同時で使用できるもんなのでしょうか?
#マルチスレッドプログラミングのことを理解してませんね?
基本的にServlet/JSPなんて正にこれです.



う、たぶん理解していなんでしょう。。

なんか単純にあるオブジェクトがあって、今はAさんが
使っているんだからBさんは使えないよ。ていう図式が
思い浮かんでしまったんです。

かなり基礎ですかね。。

とりあえずやりたいことは、EJBつかってて主キー生成
をどうするかなってことになって。
EJBでやろうとすると、めんどくさいんで一個クラス作って
そいつがJDBC経由でDB(oracle)のシーケンスからID拾って
こようという話になったのです。

そこでシーケンスIDを取得するクラスを普通のクラスに
すると、毎回newするのもめんどうだし、だったらsingleton
にするか、となったわけです。

そこで高負荷がこのクラスにかかった時並行処理できるのかな?
と思っちゃったわけです。

普通のクラスであれば、要求毎にオブジェクトを生成するので
並行処理できるのは当たり前だけどsingletonでは?と。

というわけなので、singletonでいいような気がしてきました。
属性とかいじるわけではないので。
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2003-04-10 15:20
悪夢を統べるもの さん
引用:

この辺はアルゴリズム依存です.
同時書き込みに対してさえも不要な場合はあります.


確かに。
同一オブジェクトでも異なる属性への書き込みである場合や、同じ属性の書き込みでも、その変更がアトミックである場合なら、同期がいらない場合がありえますね。

(株)ぽち さん
引用:

一個クラス作って
そいつがJDBC経由でDB(oracle)のシーケンスからID拾って
こようという話になったのです。

そこでシーケンスIDを取得するクラスを普通のクラスに
すると、毎回newするのもめんどうだし、だったらsingleton
にするか、となったわけです。


これだと、残念ながら動作はシーケンシャルになってしまいますね。
シーケンス使うからシーケンシャル。というダジャレじゃなくて、RDBの同じレコードに対する更新を繰り返すことになるので、RDBMSの方で排他制御がかかるためです。
ただ、Singletonにすることで毎回newするコストはかからないですし、メソッドをsynchronized宣言する必要もありませんから、まったく無意味、ということにはならないでしょうけど。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-04-10 17:55
>Singletonクラスはメモリ上で唯一の
>オブジェクトを皆で使おうというクラスだと思います。
「Singletonパターンは(JavaVMに対して)インスタンスがただ一つ
しか存在しないことを保証するパターン」
という方がより正確だと思います.

>かなり基礎ですかね。。
>とりあえずやりたいことは、EJBつかってて主キー生成
>をどうするかなってことになって。
マルチスレッドはサーバーサイドJavaでは必須の基礎知識の一つだと
思ってます.

知らないでやってると,とてつもない致命的なバグを発生させかね
ないと思います.もし,知人からそういう相談を受けたならば,
マルチスレッドを一から勉強することを強く勧めるでしょう.

まあ,知らないでプログラムを書いていても,滅多にトラブルに
ならない点がJavaの凄いところなんですけどね.C/C++だと,
知らないままマルチスレッド=プログラミングなんてまず出来ない.
知っててもデバッグで死ぬほど苦労すること請け合いです.
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-04-10 20:13
引用:

知らないでやってると,とてつもない致命的なバグを発生させかね
ないと思います.もし,知人からそういう相談を受けたならば,
マルチスレッドを一から勉強することを強く勧めるでしょう.



知人にSingletonでConnectionPoolみたいなクラスを作るといいよと
言ったら、JSPでScope="application"じゃいかんのか。と突っ込まれました。
たしかにWEBJavaの場合、JSPはコンテナに1つだけ常駐するんですけどね。。。
どう説明しようかな汗
みたらいなおゆき
会議室デビュー日: 2003/03/19
投稿数: 4
投稿日時: 2003-04-11 00:27
こんにちは。

引用:

へげもんさんの書き込み (2003-04-10 15:20) より:

同一オブジェクトでも異なる属性への書き込みである場合や、同じ属性の書き込みでも、その変更がアトミックである場合なら、同期がいらない場合がありえますね。




同期が不要になる場合とは、どのような場合でしょうか?

属性に対するアトミックな書き込みであっても、複数のスレッドで共有される属性であれば、
(volatile宣言するか、synchronizedなブロックに入れるなど)何らかの同期は必要では
ないでしょうか?

「Effective Java」の項目48「共有された可変データへのアクセスを同期する」を読んだ
ところでは、自スレッドで行った属性の状態変化を他スレッドに(あるいは逆に他スレッド
で行われた属性の状態変化を自スレッドに)確実に反映させるためには、
状態を変化させるタイミングで同期をとらざるを得ないように思うのです…。

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