- PR -

排他制御(半排他?)について

1
投稿者投稿内容
あすてか
会議室デビュー日: 2007/10/05
投稿数: 4
投稿日時: 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);
  }
}
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-10-24 11:46
簡単に行うならCopyOnWriteArrayListを使います。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/CopyOnWriteArrayList.html
あすてか
会議室デビュー日: 2007/10/05
投稿数: 4
投稿日時: 2007-10-25 00:23
nagiseさん、ありがとうございます。
1.5以降だと便利なクラスがあるのですね。
ですが今回1.4を使用していました。。
書き込み忘れました。申し訳ございません。

実は今回servletで簡単なショッピングサイトみたいな物を作っていまして
お客が商品を表示(show())中に、店員が商品を追加(add())した時に
同じ商品が2個表示されたりしてしまうんですよね。

世間のショッピンサイトではこれをどうのように防いでいるのでしょうか?
(DB詳しくないですがDBを使えば意識しないで良くなる?)

よろしくお願い致します。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-10-25 00:51
「read-write ロック」という手法がまさにそのためのものです。
1

スキルアップ/キャリアアップ(JOB@IT)