Sequenz-Generator in Java, der für die Eindeutige Id

Ich Plane, schreiben einen Sequenz-generator verwendet wird
in meiner REST-Ressource-Umsetzung Klasse während des post zu generieren
eindeutige id. Da jede post-Anforderung erfolgt durch separaten thread
Ich habe die variable volatile und Methode synchronisiert.
Ich habe keine option zur Verwendung von Sequenzen oder was
traditionelle RDBMS bietet.

public class SequenceGen {
    volatile static int n = 0;  
    public synchronized int nextNum(){
        return n++;
    }   
}

dies ist, was ich habe, so weit, und die Planung um eine variable zu erstellen von
SequenceGen in meinem REST-Implementierung. Meine eigentliche Frage ist, wird
es brechen irgendwo ? Getestet habe ich mit zwei threads und ich sehe nicht ein,
jeden Wert wiederholt.

  • machen nextNum Methode static machen es sicher.
  • Wenn Ihr die ersten tests zeigen, dass es geht und Ihre Logik sagt, es sollte funktionieren, im Allgemeinen sollte man keine sorgen mehr und akzeptieren, dass es funktioniert (jetzt). Sorgen machen, wenn es tatsächlich ein problem darstellt.
  • Warum nicht einfach ein AtomicInteger?
  • Mehr als eine jvm beteiligten in Ihrem Prozess? In Ihrem POC, ich nehme an, Sie sind mit einer einzigen jvm.
  • Das Feld sollte privat sein. volatile ist redundant, da Sie den Zugriff auf eine synchronisierte Methode. Aber ich Stimme mit fge: ein AtomicInteger ist eine bessere, sicherere und schnellere Lösung. Wenn Sie planen, mehrere VMs, sollten Sie erwägen, eine UUID statt (aber Sie erhalten eine Zeichenfolge, die nicht ein int)
  • Ich bin mit JVM nur
  • Nizet, Danke für den Hinweis private und Entlassungen. . Zunächst wollte ich nur halten Sie nur flüchtig. Ich werde AtomicInteger und erwägen, es zu benutzen.
  • volatile reicht nicht aus. ++ ist keine Atomare operation, und Sie könnte sich somit eine race condition. Auch Ihr methos sollte auf jeden Fall statisch sein. Ansonsten, deine threads synchronisieren sich auf zwei verschiedene Objekte, was bedeutet, dass Sie nicht die Synchronisation. Das ist ein bug, den Sie nicht hätte mit AtomicInteger, die inhärent thread-sicher.
  • Nizet, Liest und schreibt sind atomic für alle Variablen volatile deklariert (einschließlich long-und double-Variablen). aus docs.oracle.com/javase/tutorial/essential/concurrency/...
  • Eine lese-atomar ist. Ein schreiben ist atomar. Aber ++ macht zu Lesen, dann eine Schrittweite, dann schreiben. Und, dass die Reihenfolge der Operationen ist nicht atomar. Also zwei threads Lesen kann, den gleichen Wert, erhöhen Sie parallel, und das gleiche schreiben nächste Wert in parallel. Das ist, warum AtomicInteger.incrementAndGet() vorhanden ist.
  • Nizet, vielen Dank für die Erklärung. Ich werde AtomicInteger
  • Dieser statische Wert verloren, wenn wir den server neu starten, richtig?

InformationsquelleAutor Ayan | 2014-03-14
Schreibe einen Kommentar