[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10629] Re: 事実上のサーバー用 JavaChip か?



(株)ネットジーンの村山です.

> 村山さんが心配しているのは、「メソッドにsynchronizedがついているから、排他は
> 別に考えなくてもじゃんじゃん使おう」と安易に捉えてはいけない、ということです
> かね。そのような誤解を生じさせる可能性があるので、危険であると。
もちろんそれもありますが,

「メソッドにsynchronizedがついていたらもちろん,付いていない場合でも
内部的に同期を取っているなら,可能な限り使わないようにすべきだ.」
というのはマルチスレッド プログラミングの基本だということです.

> >   また、前回の読書会でも話題になりましたが、javadocが出力
> > するAPIドキュメントには synchronized に関する情報が表示さ
> > れないということを考慮すると、プロジェクト等で採用するライ
> > ブラリにはソースコードが必須ということになるでしょうか?

ドキュメントには,同期に関する情報は明記すべきです.

そのクラスがマルチスレッドで使用可能か否か,使用可能な場合はどのような
利用に関して何を保証してくれるのか,どのような制限があり,どのような
危険性があるか,このようなことを全てドキュメントに書くべきでしょう.

そして,あるメソッドがsynchronizedであるか否かということは,この様な情報を
全くといって良いほど切提供してくれません.API利用者にとっては無価値な情報です.

また,同期化に関することがドキュメントに書いてあれば,その実装として末端の
メソッドでsynchronizedメソッドを使おうと,内部でsynchronizedメソッドや
synchronized文を利用していようと,或いはもっと他の方法で同期を取っていようと,
それは実装依存の話です.ある実装ではAPI自体がsynchronizedメソッドになってた
としても,他の実装では同期化されたクラスを他の(非synchronizedメソッドの)
クラスでラップするようになってたり,或いはもっと他の方法で同期化するようなって
いたとしても,それは実装依存の話なので仕様変更には当たらない,ということでは.

-----
重要なのは,APIとして見える,一番外側のメソッド自体にsynchronizedがあるか
どうかと,そのクラスが本質的にマルチスレッドで利用可能か否か,或いはその
クラスがそもそも排他制御をしているか否かということとは全くといって良いほど
無関係だということだと思います.

synchronizedと宣言していても,マルチスレッドで使えない状況などいくらでも
考えられますし,宣言していなくても内部的に排他制御をしていればマルチスレッド
で安全に利用可能なのも,ボトルネックになりうるのも変わりません.
#不変オブジェクトや副作用のないメソッドの場合などもマルチスレッドで
#安全に利用可能だが,まずボトルネックになる心配がない点が異なる.

##不変オブジェクトでもsynchronizedメソッドを使ってたらボトルネックになり
##うるが,よほど妙な趣味がない限り,そういう設計はしないでしょう...

>(※居酒屋で「よっぽど恨みがあるんだねー」とか石黒さんに突っ込
>まれてましたね (^^) > 村山さん )
というか,同期を極力避けるように設計するのは鉄則ですから.


ちなみにエッフェル塔本,かなりごついです....

-- 
村山敏清 株式会社ネットジーン 
〒169-0051 東京都新宿区西早稲田2-15-10 2F 
E-mail:murayama@xxxxxxxxxxxxx 
TEL:03-5155-3720 FAX:03-5155-3723
http://www.netgene.co.jp/