0

スレッド セーフ環境で静的 Arraylist を定義する方法。Synchronized キーワードを試してみましたが、Java 並行パッケージの Automic クラスを使用することが静的配列リストの最適なソリューションであると聞きました。安全な方法で静的配列リストを宣言して使用する方法を誰か教えてもらえますか?

アップデート:

私のコードでは、アプリケーションにログインしているユーザーの詳細を維持するための静的リストがあります

private static List<UserSessionForm> userSessionList = new ArrayList<UserSessionForm>();

ログイン中およびホームページへのアクセス中 (ホームページにアクセスしたときは常に) userSessionList でユーザーの詳細をチェックし、利用できない場合は userSessionList に詳細を追加し、ログアウト中にリストからユーザーの詳細を削除します。ログイン中

if (getUserSessionIndex(uform)!=-1) {
            this.getUserSession().add(usform);
            this.getSession().setAttribute("customerId", getCustomer_id());
        }

ログアウト中

  public void logout(){
     int index = getUserSessionIndex(usform);
        //if user is  already loginned, remove that user from the usersession list
        if (index != -1) {
            UserAction.getUserSession().remove(index);
        }
   }

  private int getUserSessionIndex(UserSessionForm usform) {
    int index = -1;
    int tmp_index = 0;
    for (UserSessionForm tmp : UserAction.getUserSession()) {
        if (usform.equals(tmp)) {
            if (usform.getUserlogin_id() == tmp.getUserlogin_id()) {
                index = tmp_index;
                break;
            }
        }
        tmp_index += 1;
    }
    return index;
}

そのため、読み取りと書き込みのリクエストが同時に行われる可能性があります

4

2 に答える 2

4

どのように使用するかによって大きく異なります。いくつかのオプションがあります:

  • use CopyOnWriteArrayList- これは最新の並行実装であり、書き込みが比較的少なく読み取りが多い場合に最適です。
  • 経由で取得された同期ラッパーを使用しCollections.synchronizedListます。これにより、たとえば含まれているオブジェクト内から「元の」非同期リストにアクセスできますが、「外部の世界」へのスレッドセーフなアクセスが提供されます。

Vectorは古い古いコレクションの実装であり、新しいコードでは使用しないでください。

于 2011-05-23T11:01:22.017 に答える
3

これは、「基になる配列の新しいコピーを作成することによって、すべての変異操作、、などが実装されるArrayListのスレッドセーフなバリアント」ですjava.util.concurrent.CopyOnWriteArrayListaddset

于 2011-05-23T10:59:04.640 に答える