Ja.
- Die Kombination aus flüchtigen Operationen und Compare-and-Swap-Operationen reicht aus, um sicherzustellen, dass die Node-Objekte sicher veröffentlicht werden.
-
Der Compare-and-Swap muss
volatile
in beiden Methoden vor der Zuweisung zu einer Variablen stehen, damit Sie dort gut zurechtkommen. Sie müssen nicht atomar geschehen.
Die Warteschlange zeigt ein merkwürdiges Verhalten. Nehmen wir an, Thread 1 stoppt putObject()
nach dem CAS, aber vor der letzten Zuweisung. Der nächste Thread 2 wird putObject()
vollständig ausgeführt. Beim nächsten Thread drei Aufrufe getObject()
, und es kann keines der ersten beiden Objekte angezeigt werden, obwohl Thread 2 vollständig ausgeführt wurde. Im Speicher wird eine kleine Kette aufgebaut. Erst nach Abschluss von Thread 1 putObject()
sind beide Objekte in der Warteschlange sichtbar, was etwas überraschend ist und eine schwächere Semantik aufweist als die meisten nicht blockierenden Datenstrukturen.
Eine andere Sichtweise auf die ungerade API ist, dass es nett ist, eine Nichtblockierung zu haben, put()
aber es ist sehr merkwürdig, eine Nichtblockierung zu haben get()
. Dies bedeutet, dass die Warteschlange bei wiederholten Abfragen und beim Schlafen verwendet werden muss.