Frage

Wir haben zwei Threads eine Liste über eine synchronisierte Methode zugreifen. Können wir

a) verlassen sich auf die Laufzeit, um sicherzustellen, dass jeder von ihnen den Zugang zum Verfahren auf der Grundlage der um sie versuchten, erhalten oder

b) folgt die VM keine anderen Regeln

c) Gibt es einen besseren Weg, um die Anfragen zu serialisieren?

War es hilfreich?

Lösung

Nein, synchronisierten Zugriff in beliebiger Reihenfolge geben wird (Abhängig von der JVM-Implementierung). Dies könnte sogar dazu führen, Themen in einigen Szenarien zu verhungern.

Sie können den Auftrag sicherzustellen, indem sie mit ReentrantLock (seit Java 5.0) mit der fair=true Option. (Lock lock = new ReentrantLock(true);)

Andere Tipps

Nein, Sie können nicht sicher sein, dass zwei Anrufe auf eine synchronisierte Methode, um auftreten. Die Reihenfolge ist nicht spezifiziert und die Umsetzung abhängig.

Dies ist in der 17,1 Locks der JLS. Beachten Sie, dass ist, sagt nichts über die Reihenfolge, in der Fäden auf eine Sperre warten sollten Zugang gewinnen.

Sie können nicht auf die Reihenfolge verlassen, in dem die bestimmte Methode von jedem Threads aufgerufen wird. Wenn es nur zwei Threads ist, kann ja sein. Aber vorstellen, wenn es 3 Fäden und 1 Faden bereits erworbener Zugang. Die anderen 2 Fäden, wenn sie versuchen, den Zugriff warten und jeder von ihnen kann den Zugang gewährt werden, und dies hängt nicht von der Reihenfolge, in der sie diese Methode aufgerufen. So ist es nicht auf die Reihenfolge vorgeschlagen verlassen.

  

c) Gibt es einen besseren Weg, um die Anfragen zu serialisieren?

Sind Sie zufällig die Liste als eine Warteschlange verwendet wird, das heißt, wird das Nutzungsmuster wie folgt aussehen?

while (some condition) {
    synchronized(theList){
        anItem = get and remove an element from theList
    }
    do some work with anItem
}

Wenn ja, können Sie auf der BlockingQueue Schnittstelle statt der eigenen Sperrschemata verwenden. Die Implementierungen (wie ArrayBlockingQueue ) haben die Einstellungen für Fairness und vieles mehr.

Ich lasse immer Synchronisationen auf Anwendungsserver oder Motor, es sei denn eigene Intensität definieren

Ja.

Wenn der Zugriff auf die Liste über eine synchronisierte Methode ist, werden gleichzeitige Anforderungen von mehreren Threads serialisiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top