少し疑問に思ったので調べてみた。


文字編集や、日付のString化など、汎用的に使用するUtilクラスを作成したときのこと、

メソッドを static にしていいもんだか悪いもんだか。


なぜそんな事を悪いかと思っている理由は以下の通りだったりする。


(1) static = 静的 である。

(2)静的ってことはスレッド処理時にそのまま静的な変数を持つ?

(3)static化したUtilクラスを使用したとき、なんらかの不具合が発生するんじゃないか??


という推測が2つ重なった関係である。

しかし、その(2)推測が間違っていたことを後日知る。

知ったのは、ほんのちょっぴり仕事の合間を縫ってネットで

調べてみた結果だった。


[調査結果]

(2)静的ってことはスレッド処理時にそのまま静的な変数を持つ?

 ->クラスを static 化、メソッドを static 化し、スレッド処理しても

  処理時、スレッド内に変数を保持してくれる為、不具合は発生しない。

  スレッドセーフ(※1)である。

  

例:

public static int sample(int i,int pCnt){
    pCnt= pCnt+ i;   
//スレッドセーフ

   return pCnt;

}


・ただし、Utilクラス内に static変数 があった場合、スレッド処理しても、

その変数は静的に処理されれる(使い回される)為、スレッドセーフとはならない。


例:

private static int cnt;    //スレッドセーフとはならない。

public static void sample(int i,int pCnt){
    pCnt = pCnt + i;  

    cnt = pCnt;

}



※1

スレッドセーフとは、

マルチスレッド環境でも、プログラムやライブラリなどが正しく安全に動作することが保証されていること。(@ITより転機)

専門用語か造語か不明だった為、調べました。


<参考リンク>

■教えて!goo 質問:staticのメリット、デメリット

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1355755


@IT > @IT総合検索 > Insider's Computer Dictionary > [スレッド・セーフ]

http://www.atmarkit.co.jp/icd/root/10/86966010.html