- PR -

Javaのクラスメソッド(static)について

投稿者投稿内容
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-07-13 13:04
あしゅさんと同意見ですが、例えばstaticメソッドの中で、
コード:
HogeFactory factory = new HogeFactory();
Hoge hoge =factory.getHoge();


みたいなコードを書いたとします。ぱっと見は安全っぽいですが、
getHoge()の戻り値がstaticの一意なインスタンスだったりすると、確実に競合を起こします。
しかしAPIのコードが非公開だったりすると、安全かどうか見えにくいものです。

APIによって適切なコードを書くのが重要で、
一概にstaticメソッドからstaticフィールドを参照しなきゃ安全とは言えないですね。

#例で言えばstaticフィールドを参照していますが、
#APIによって隠蔽されているケースもあって、
#単純に判断できないという話です。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2006-07-13 13:16
引用:

そんなことありません。

staticは何も考えなくても複数のスレッドから同時にアクセスできるため
競合が発生しやすいのですが、非staticでもプログラムの作り次第で
複数スレッドから共有されることは普通にあるでしょう。

短絡的に「これはこう」って憶えるのは危なっかしい感じがします。


そうなんですか。
サンプルコードのように引数をいじらないで、クラス変数に気をつけてれば、
短絡的に「これはこう」でいいと思いますが。
質問のように負荷が高い状況で何かが発生するのでしょうか。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-07-13 13:52
引用:

Anthyhimeさんの書き込み (2006-07-13 13:16) より:
そうなんですか。
サンプルコードのように引数をいじらないで、クラス変数に気をつけてれば、
短絡的に「これはこう」でいいと思いますが。
質問のように負荷が高い状況で何かが発生するのでしょうか。



一番最初のサンプルでは問題ありませんよ。

気になるのは、

static ⇒ 排他制御を考える
非static ⇒ 排他制御は不要

と単純に捉えてしまう人が非常に多いからです。

static/非staticの違いは、オブジェクト型ならば、参照がどこの
領域に確保されるかの違いでしかなく、実体には影響しません。

問題は、実体が複数のスレッドに共有される可能性があるのか、
という点を考えて排他制御が必要なのか、不要なのかを判断
しなければならないということです。

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