- PR -

VectorかArrayListか?

1
投稿者投稿内容
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2005-07-01 18:45
Vectorは同期処理を行うので同期処理が必要でない場合は
ArrayListを使用する必要があると認識しています。

この同期処理が必要かどうかですが
宣言したオブジェクトに対して追加、更新をせず、読込しか
行わないのであればマルチスレッドで同時にアクセスされようが
ArrayListを使用して大丈夫でしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-01 19:36
どういう要件で使用されるのかはわかりませんが、
通常問題ないと思います。

ちなみに、Vectorがスレッドセーフかというと、条件付のスレッドセーフです。
コード:
//フィールド
Vecter v = new Vector();

//メソッドのどこか
for(int i = 0; i < v.size(); i++){
    Object obj = v.get(i);
}


v.size()を呼んで復帰するまではスレッドセーフですが、
次のv.get(i)を読んだ時点で、iの値の場所にオブジェクトがあるとは限りません。
forステートメント内のv.size()と、次のステートメントのv.size()が
更新されれば違う可能性があると言う事です。

完全にスレッドセーフにするのであれば、
コード:
//フィールド
List list = new ArrayList();            //VectorでもArrayListでもいい

//メソッドのどこか
synchronized(list){
    for(int i = 0; i < list.size(); i++){
        Object obj = list.get(i);
    }
}


としなければいけません。

Vectorの場合、完全なスレッドセーフが保障されているわけでもなく、
殆どのメソッドに対してsynchronized装飾子が付いている為、
オーバーヘッドが大きく、一般的に推奨されていないと思います。
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2005-07-01 20:14
わざわざ例文までありがとうございます。

>v.size()を呼んで復帰するまではスレッドセーフですが、
>次のv.get(i)を読んだ時点で、iの値の場所にオブジェクトがあるとは限りません。
これにはなるほどです。

ところで今回の要件ですが
読込しかされない処理(多重アクセスはされる)の対象がVector
だったので、ArrayListに変更しても構わないかどうかの確認でした。

問題ないとのことだったのでArrayListに変更しようと思います。

1

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