人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Java のプログラミングについて質問です。

if(hoge != null) {
hoge.doSomething();
}

hoge が null でないとき doSomething したいのですが、
hoge の値は別スレッドで null に書き換えられてしまう可能性があります。
こういうときは、どういうふうに書くのがよいのでしょうか?
教えて下さい。

●質問者: akagi_paon
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:hoge Java スレッド プログラミング
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● hanako393
●0ポイント

synchronizedブロックを使います。

https://club.panasonic.jp/fun/sec/mp/login.do?PAGE_CTRL_STATUS=C...

◎質問者からの返答

こゆこと?

private Hoge hoge = new Hoge();

public void assignNull() {
 synchronized(this) {
 hoge = null;
 }
}

public void execute() {
 synchronized(this) {
 if(hoge != null) {
 hoge.doSomething();
 }
 }
}

これって hoge を書き換えるときはいつも synchronized しなくちゃいけないんじゃない?

めんどくさ?。

→ そうか。setHoge() を作って synchronized しちゃえばいいのか。

private Hoge hoge = new Hoge();

public void assignNull() {
 setHoge(null);
}

public void execute() {
 synchronized(this) {
 if(hoge != null) {
 hoge.doSomething();
 }
 }
}

public void setHoge(Hoge hoge) {
 synchronized(this) {
 this.hoge = hoge;
 }
}

こうか。

→ ていうか Null Object 使った方がコスト安くない?

private volatile Hoge hoge = new Hoge();

public void assignNull() {
 setHoge(null);
}

public void execute() {
 hoge.doSomething();
}

public void setHoge(Hoge hoge) {
 if(hoge == null) {
 this.hoge = NullHoge.getInstance();
 } else {
 this.hoge = hoge;
 }
}

2 ● t-wata
●70ポイント

http://q.hatena.ne.jp

メソッド内で宣言したローカル変数なら、外のスレッドからいじられることはないから、

フィールドからいったんローカル変数にいれて、その後でnullかどうかを判定すればいいと思うけど。

void hogehoge(){
Hoge _hoge = this.hoge; //参照のコピーを作る
//この後は、this.hoge = null; してもされても _hogeの参照は最初のまま
◎質問者からの返答

なるほど!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ