[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 01/06 12:55 / Filesize : 277 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者】Java質問・相談スレッド115【歓迎】



170 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 00:36:59 ]
java.util.Collections#synchronizedList() の使い道(使い方)がわかりません。

java.util.List は同期化されませんが、以下のようにすれば、list はスレッドセーフになって帰ってくるのですよね。

List unsyncList = new ArrayList();
List list = Collections.synchronizedList(unsyncList);

○質問1:
マルチスレッド環境において、
Collections#synchronizedList() が返した list に対しては、
synchronized ブロックでくくらずに add() や get() しても、スレッドセーフが保たれるという理解でよいですか?

○質問2:
javadoc の Collections#synchronizedList() のところに、
以下のように書いてあるのが気になります。

>返されたリストの繰り返し処理を行う場合、ユーザは、次に示すように手動で同期をとる必要があります。
>
>List list = Collections.synchronizedList(new ArrayList());
>  ...
>synchronized(list) {
>  Iterator i = list.iterator(); // Must be in synchronized block
>  while (i.hasNext())
>    foo(i.next());
>}
>これを行わない場合、動作は保証されません。

これは、list の add() や get() は質問1:で同期化されるようになったが、
list.iterator() が返すイテレータへのアクセスは同期化されていないので、
イテレータでグルグルまわすときは、synchronized 文で自分で同期化してね、という理解でよいでしょうか?







[ 続きを読む ] / [ 携帯版 ]

全部読む 前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<277KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef