
よろしくお願いします。
マルチスレッド下で動作するクラスを作成しています。データにアクセスするためのオブジェクトを
クラスのフィールド値として保持し、使い回しを行いたいと考えています。このデータアクセスオブジェクト(以下Dao)内では特にフィールドは使用せず、全てローカル変数のみで動作するようになっています。Dao自体は初回のクラス生成時にstatic処理にてフィールドにセットされます。
このDaoを保持するフィールドは、staticなクラス変数が良いのか、インスタンス変数として保持する方が良いのか迷っております。
クラス変数ならばPermanent領域をオブジェクト1つ分のメモリ使用で済み、インスタンス変数だとスレッド毎にheapを使い、処理数が増えるとメモリ圧迫しちゃう?と安易に考えてしまったりしています。
ご意見・ご助言よろしくお願い致します。
No.5ベストアンサー
- 回答日時:
staticフィールドはよいと思いますよ。
フィールド定義でオブジェクトを new するか、static 初期子で初期化すれば、初期化時におけるスレッドの競合を避けられるので
問題ないし、全てのスレッドから可視のオブジェクトができます。
ただし、Daoオブジェクトがクラス変数もインスタンス変数も持たなくても
処理に必要な内部オブジェクトや外部への参照がスレッドセーフでない
可能性があるので注意が必要でしょう。
普通にシングルトンするという手もあります。
No.4
- 回答日時:
>FactoryやSingletonのようなパターンを使用する場合、生成するオブジェクトをあらかじめstaticフィールドの変数として保持しておいて、それを返すといったcodeをよく目にします。
>どれも、実体は同じであるオブジェクトへの参照となるのですが、これもマルチスレッド下で使用することは危険と捉えるべきなのでしょうか?
以下ページの「まとめ」の「◎マルチスレッド環境での使用」を参照して下さい。
http://www.nulab.co.jp/designPatterns/designPatt …
No.3
- 回答日時:
ちょっと勘違いがあるようなので
>FactoryやSingletonのようなパターンを使用する場合、生成するオブジェクトをあらかじめstaticフィールドの変数として保持しておいて、それを返すといったcodeをよく目にします。どれも、実体は同じであるオブジェクトへの参照となるのですが、これもマルチスレッド下で使用することは危険と捉えるべきなのでしょうか?
デザインパターンは、クラス設計のパターンなだけであり、スレッドセーフを保証する仕組みではありません。マルチスレッド環境でのスレッドセーフが要求される場合、独自に対応する必要があります。
あと、Javaではスレッドチェンジを抑制することはできません。
Synchronizedブロックを使用しても、オブジェクトにロックが掛かるだけです。
参考URL:http://www.ibm.com/developerworks/jp/java/librar …
No.2
- 回答日時:
スレッドセーフなのは当然として。
staticにするか否かは、インスタンス数を決定することであり、インスタンス生成のコストにより決めます。
インスタンス生成のコストが深刻ならばシステムに付き1つ、
上限を設けたいならばオブジェクトのプーリング、
生成コストよりも処理数を上げるならば、インスタンス数は呼び出し側で決定するなどです。
私ならば、インスタンス変数にしてしまい、フレームワークでインスタンス数を決めます。
安易にstaticを使用すると、テストが困難になったり、再現性のないバグの元です。
No.1
- 回答日時:
>マルチスレッド下で動作するクラスを作成しています。
だったらスレッドセーフに作らんとイカンだろ?
>staticなクラス変数が良いのか
staticなクラス変数は「誰かがこのクラスを既に使用中で、二重には使えない」って場合に、二重実行を監視する為に使う。
例えば、誰かがデータのレコードを読み込んで、一部だけ書き換えてアップデートする場合、アップデートが終わるまで、レコードを保持している変数と、書き換えたいレコードは「他のスレッドではアクセスしちゃいけない」のは自明。
そういう場合は「どのスレッドからも見える、ただ1つのフラグ変数」が必要になる。そのフラグが付いてたら「触るな」って事だから。
変数をstaticで置く場合は「その変数の使用開始から使用終了まで、一切、スレッドチェンジが起きない事」を保証しないといけない。
APIコールやOSコールを行うと、OSで勝手にスレッドチェンジが入るから「スレッドチェンジが起きない事」ってのは「APIコールやOSコールを一切使わず、CPUを占有する」ってこと(そして、そういうプログラムは忌避される)
マルチスレッドを軽く考えてると「思いもよらないバグ」で1~2ヶ月は泣かされる事になる。
この回答への補足
chie65535様
丁寧なご回答ありがとうございます。自分の勉強不足を痛感しております。
一点質問がございます。
FactoryやSingletonのようなパターンを使用する場合、生成するオブジェクトをあらかじめstaticフィールドの変数として保持しておいて、それを返すといったcodeをよく目にします。どれも、実体は同じであるオブジェクトへの参照となるのですが、これもマルチスレッド下で使用することは危険と捉えるべきなのでしょうか?
ご回答への質問となってしまい申し訳ございませんが、よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) Access VBA を利用して、フォルダ内のファイルの名称を変更したい 1 2023/08/03 08:27
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
Strutsのbeanタグについて
-
パワーポイントのVBAでテキスト...
-
VBA 同じ名前のオブジェクトを...
-
Excelで =EMBED("Acrobat Docu...
-
多人数のじゃんけんプログラム
-
C#でフォームのオブジェクト名...
-
非アクティブの状態で表示され...
-
VBA 過去のファイル内の同じオ...
-
オブジェクトを枠線に合わせる...
-
オブジェクトレベルとメタレベル
-
3Dの背景とはどういう作り方を...
-
C++でのクラスオブジェクトの破棄
-
CoCreateInstanceでエラーになる。
-
COMコンポーネントって何?
-
三角形オブジェクト
-
error C2712: オブジェクト ア...
-
Power Pointのページ設定について
-
ビジュアルC++でボタンの有...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
パワーポイントのVBAでテキスト...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
CoCreateInstanceでエラーになる。
-
ワイルドカード<?>と型パラメー...
-
戻り値がクラスオブジェクト
-
error C2712: オブジェクト ア...
-
Vbで通常使用するプリンターを...
-
質問すいません。 javascriptの...
-
Object型からDouble型へのキャスト
-
Accessの連結・非連結オブジェ...
-
オブジェクトレベルとメタレベル
-
C++でのクラスオブジェクトの破棄
-
時間帯判定をする。
-
VBAでvlookup関数から、別シー...
おすすめ情報