- - PR -
排他制御(半排他?)について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-10-24 01:46
排他制御(半排他?)について教えて頂きたいです。
メンバ変数に、@配列(list)を持ち メンバ関数に、A配列表示(show)、B配列追加(add)を持ち 複数スレッドから呼び出される場合に show()は複数スレッドから同時呼び出し可能にし add()が呼ばれた時には、他スレッドからのshow()・add()を排他にしたいのですが 2関数をsynchronizedメソッドにすると、show()同士でもブロックされてしまいます。 このような制御をするには、どのような方法で実現できますでしょうか。 アドバイス頂きたいです。よろしくお願い致します。 public class Test { private List list = new ArrayList(); //@配列 public Test() { list.add("1"); list.add("3"); list.add("5"); } // A配列表示 public void show() { for(int i=0; i<list.size(); i++) System.out.println(list.get(i)); } // B配列追加 public void add(String str) { list.add(str); Collections.sort(list); } } |
|
投稿日時: 2007-10-24 11:46
簡単に行うならCopyOnWriteArrayListを使います。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/CopyOnWriteArrayList.html |
|
投稿日時: 2007-10-25 00:23
nagiseさん、ありがとうございます。
1.5以降だと便利なクラスがあるのですね。 ですが今回1.4を使用していました。。 書き込み忘れました。申し訳ございません。 実は今回servletで簡単なショッピングサイトみたいな物を作っていまして お客が商品を表示(show())中に、店員が商品を追加(add())した時に 同じ商品が2個表示されたりしてしまうんですよね。 世間のショッピンサイトではこれをどうのように防いでいるのでしょうか? (DB詳しくないですがDBを使えば意識しないで良くなる?) よろしくお願い致します。 |
|
投稿日時: 2007-10-25 00:51
「read-write ロック」という手法がまさにそのためのものです。
|
1