Javaで使ってるクラスがスレッドセーフなのかスレッドアンセーフなのか調べる

調べてみたけど、あんまり・・・
kanata約7年前に追加

Javaって、使ってるクラスがスレッドセーフなのかスレッドアンセーフなのか、JavaDocとか見て地道に調べるしかないん?
そう言われれば、Javaってスレッドアンセーフとかそんなに気にしてなかったな。。
singletonなインスタンス変数に、複数スレッドからwriteするような場合だけ、synchronizedつけるかどうか、気にするぐらいで済むからかな?

スレッドアンセーフかどうか調べる

JavaDockから、"スレッド"という単語が含まれている文を抜き出す。簡単だけど、それでだいたい判断できる。
シェル芸でやってみた。Qの変数にクラス名を設定する。

$ Q="StringBuffer";P=`curl -s -L http://docs.oracle.com/javase/jp/7/api/overview-tree.html|grep /$Q.html|awk -F'"' '{print $4}'`;curl -s -L http://docs.oracle.com/javase/jp/7/api/$P|sed 's/<[^>]*>//g'|grep "スレッド"
スレッドセーフな可変の文字列。文字列バッファーは String に似ていますが、変更できる点が異なります。文字列バッファーには常に文字列が格納されていますが、文字列の長さと内容は特定のメソッドの呼び出しにより変更できます。
文字列バッファーは複数のスレッドによって安全に使用することができます。メソッドは必要に応じて同期化され、特定のインスタンスでのすべてのオペレーションが、関連のある個々のスレッドによって行われるメソッドの呼び出しの順序と一致する連続した順序で発生するように動作します。
 JDK 5 以降、このクラスは単一のスレッド StringBuilder により使用されるよう設計された等価のクラスで補足されています。 StringBuilder クラスは、このクラスと同じ処理をすべてサポートしながらも高速であり、同期を実行しないので、通常はこのクラスに優先して使用される必要があります。

スレッドアンセーフを気をつけなきゃいけないクラス一覧

ともあれ、一覧を作ってみたので晒す。
作ってみたものの・・・実用的には「う~ん」な感じだけれど。

以下参照

当ページのWiki Java - Appendix スレッドセーフ・スレッドアンセーフについて


コメント

クリップボードから画像を追加 (サイズの上限: 100 MB)