Frage

Betrachten wir eine primitive Variable vom Typ mit vielen Threads zu lesen und ein paar Threads zu schreiben, wird der folgende Code korrekt funktioniert?

Wenn es will, tut es eine bessere Leistung als 1 zur Verfügung stellen). Deklaration an allen Methoden synchronisiert ist; 2). Verwendung eines expliziten ReadWriteLock?

Ist das ein gemeinsames Muster? Wenn nicht, ist das, was in der Regel Muster in dieser Situation verwendet?

Das funktioniert derzeit gut für mich, aber ich glaube, es ist ein wenig redundant sowohl flüchtige als auch synchronisiert zu verwenden.

private volatile int value = 1;

public void func1()
{
    if (value == 1) {
        // do something
    }
}

public void func2()
{
    if (value == 2) {
        // do something
    }
}

public void func3()
{
    if (value == 3) {
        // do something
    }
}

public synchronized void increase()
{
    if (value < 10) value++;
}

public synchronized void decrease()
{
    if (value > 0) value--;
}
War es hilfreich?

Lösung

  

Betrachten wir eine primitive Variable vom Typ mit vielen Threads zu lesen und ein paar Threads zu schreiben, wird der folgende Code korrekt funktioniert?

Ich glaube schon.

  

Wenn es will, tut es eine bessere Leistung als 1 zur Verfügung stellen). Deklaration an allen Methoden synchronisiert ist; 2). Verwendung eines expliziten ReadWriteLock?

Ich denke, so vorgesehen, dass Leseoperationen outnumber Schreibanforderungen. Allerdings:

  • Es sei denn, dieser Zähler hoch behauptet wird, es ist wahrscheinlich keine Rolle. Vergeuden Sie nicht Ihre Zeit Mikro-Optimierung etwas, wenn Sie Beweise haben, dass es (oder wird) einen Engpass.
  • Wenn es wirklich zu Ihnen wichtig ist, Benchmark es.
  • Seien Sie nicht überrascht, wenn die relative Leistung ist abhängig von JVM-Versionen / Patch-Levels, JVM-Optionen und Hardware; z.B. Anzahl von Prozessoren und Speicherarchitektur.
  

Ist das ein gemeinsames Muster? Wenn nicht, ist das, was in der Regel Muster in dieser Situation verwendet?

Ich weiß nicht, ob dies üblich ist. Aber mein Bauchgefühl ist, dass die häufigste Methode ist nur regelmäßige Synchronisation verwenden und sich keine Sorgen darüber. Sofern Sie nicht mit einer hoch stritten Datenstruktur zu tun hat, wird der Leistungsunterschied zwischen den verschiedenen Ansätzen unbedeutend sein, um allgemeine Anwendungsleistung.

Andere Tipps

Ja, es ist üblich, zumindest bis zu einem gewissen Grad:)

Das Muster, das Sie verwenden, ist in diesem Artikel beschrieben wird IBM -> http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

(Muster # 5, billig Lese-Schreibsperre Trick)

Ich bin sicher, bietet es eine bessere Leistung, da es keine Verriegelung ist, sondern ob es richtig ist, hängt von der Absicht des Codes. Sicherlich ist das Verhalten unterscheidet sich von dem synchronisierten Fall. Ob das Verhalten der Sperre Fall ähnlich ist, hängt davon ab, wo Sie sperren.

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