- 1 名前:Javaが初心者 mailto:sage [2008/05/12(月) 03:05:27 ]
- プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 pc11.2ch.net/hp/ Webプログラミング pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド114【大歓迎】 pc11.2ch.net/test/read.cgi/tech/1207385614/ 次スレは>>990あたりで。 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 www.wikiroom.com/java/
- 264 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:32:46 ]
- >>260
>・ラップするクラスには、put と get のメソッドを作る putとgetだけを提供する場合、 >if ( list.contains(x) == false ) list.add(x); のような問題は相変わらず回避できないことに注意。 まぁ用途次第かもしれないので、わかってればかまわない。 >・HashMap にしておき、ラッパクラスの put メソッドは、内部で synchronized (myMap) { } ブロックで囲み、 >get メソッドは synchronized をつけなければ、取得時の同時並行性は確保できると思いました。 それはだめ。 変更(put)中のデータを参照(get)すると不正な結果を得たり死んだりする可能性がある。 もっと不可解なことが起きる可能性もあるけど、詳細は件の本でも読んでください。 要するにgetにもsynchronizedは必要。 同期の対象がMap1個で済む状況なら、ConcurrentHashMapは便利。 2個以上のMapを同時に更新しなければならない場合とかには無力。
- 265 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:39:06 ]
- >>262
やっぱり理解不足。 putもgetもsynchronized (myMap) { } にしておく、が正解。 getだからといってつけないと、痛い目にあう(ヒント:Atomic性) >Map の実装を ConcurrentHashMap にする 正しいといえば正しい。 だけど、並行処理で品質を高めるには1箇所で必要最低限の同期を取るのがポイント。 例えばMapとなにか別の要素もあわせて同期を取りたいとする。 すると、Mapで同期をとってさらにラップクラスで同期を調整して・・・と複雑になる。 そんな場合は同期を取るクラスは1箇所にしたほうが楽。 また、全てのメソッドを同期を取る必要があるか?という点も重要。 とはいえ、そのような要素がなければ簡単に実現できるConcurrentHashMap を使うのは正しい(シンプルこそ正義)。 予断だが、外部にさらしてもmap = null では何の影響もないぞw map.clear() 等はマズイのでオシマイには変わらないけど。
|

|