2016-07-03 18 views
3

Bin ich sicher, dass die Methode sortList (siehe Pseudocode unten) Thread-sicher ist?Java thread-safety: enum und statische Methoden

Mein Verständnis, dass "ja", da gibt es keine Variablen hier, aber ich muss sicher sein. Der Pseudo-Code:

//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

kann dies als Ausgangspunkt dienen: http://www.tutorialspoint.com/java/java_multithreading.htm –

Antwort

2

Sie können nur Thread-Sicherheit Probleme haben, wenn Sie 2 oder mehr Threads die gleichen Daten bei „gleichzeitig“ erreichbar.

Ihre Methoden sind nur manipulieren ihre Parameter. Dies bedeutet, dass egal wie oft oder wie viele Threads diese Methoden aufrufen, keine Probleme auftreten sollten.

Es sei denn, Sie würden diese Methoden auf die gleichen Objekte aufrufen.

Also, was wir bisher sehen, ist Thread-Safe.

Aber wenn Sie Ihren echter Code so etwas wie

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

tun würden (im Grunde die gleichen Array Sortierung zweimal, möglich zur gleichen Zeit) ... das wäre keine gute Idee sein.

+0

Vielen Dank. Ich sehe, das Problem könnte sein. Ich werde Änderungen von bereits verarbeiteten Listen vermeiden. –

1

Leider ist diese Methode nicht threadsicher. Sie befanden sich auf einem richtigen Pfad, indem Sie die Anzahl der an einem Aufruf beteiligten Variablen zählten, aber Sie haben vergessen, Funktionsargumente in count einzubeziehen.

Problem mit sortList-Methode ist, dass mylist Argument möglicherweise zwischen Threads geteilt wird und stellen Sie sich vor, was passieren würde, wenn zwei Threads versuchen, Liste in entgegengesetzte Richtungen zur gleichen Zeit zu sortieren.

+0

Danke. Ich werde die Änderung von Argumenten verhindern, die an sortLists übergeben werden. –