2016-07-03 8 views
3

メソッドsortList(以下の擬似コードを参照)はスレッドセーフですか?Javaスレッドセーフ:enumと静的メソッド

ここには変数がないので「はい」と理解していますが、わかりました。擬似コード:

//This method should be thread-safe 
public static void sortList (List<MyObject> list, SortType sortType) { 
    Collections.sort(list, sortType.getComparator()); 
} 

//Defines type of sorting 
public static enum SortType { 
    BY_FIELD_1 (new ComparatorByField1()), 
    BY_FIELD_2 (new ComparatorByField2()), 
    ... 
    BY_FIELD_N (new ComparatorByFieldN()); 

    private comparator; 
    private SortType (Comparator comparator) { 
    this.comparator = comparator; 
    } 

    public getComparator() { 
    return comparator; 
    } 

    //Method getFieldX in pseudo-code bellow returns a number 
    private static class ComparatorByField1 implements Comparator<MyObject> { 
    public int compare (MyObject o1, MyObject o2) { 
     return (int) (o1.getField1() - o2.getField1()); 
    } 
    } 
    ... 

    private static class ComparatorByFieldN implements Comparator<MyObject> { 
    public int compare (MyObject o1, MyObject o2) { 
     return (int) (o1.getFieldN() - o2.getFieldN(); 
    } 
    } 
... 
} 
+0

これは開始点として役立ちます: http://www.tutorialspoint.com/java/java_multithreading.htm –

答えて

2

あなたが「同時に」で同じデータにアクセスする2つの以上のスレッドを持っている場合にのみ、スレッド安全性の問題を持つことができます。

あなたのメソッドはのパラメータを操作しています。つまり、これらのメソッドを呼び出しているスレッドの頻度や数に関係なく、問題に遭遇することはありません。

同じオブジェクトでこれらのメソッドを呼び出すのでない限り、もちろんです。

これまでのところ、スレッドセーフです。あなたの実際のコード(基本的に同じ時間で可能、二度同じ配列をソートする)

List<YourObject> someObjects = ... 
sortList(someObjects); 
sortList(someObjects); 

ような何かをするかどう

は、しかし...それは良いアイデアではないでしょう。

+0

ありがとうございました。私は問題があるかもしれないと思う。私は既に処理されたリストの変更を避けるつもりです。 –

1

残念ながら、このメソッドはスレッドセーフではありません。コールに含まれる変数の数を数えて正しい経路にいたが、関数の引数をcountに入れることを忘れてしまった。

sortListメソッドの問題は、mylistという引数がスレッド間で共有される可能性があり、2つのスレッドが同時に反対方向に並べ替えようとするとどうなるかを想像してください。

+0

ありがとうございます。 sortListsに渡される引数の変更を防ぎます。 –

関連する問題