Hier ist der Code:
%Vor% Es ist ein Ausschnitt aus dem Buch Java Concurrency in Practice , und ich denke daran, dass der Counter reservations
vielleicht unnötig ist, da wir einfach queue.size()
verwenden können, um die Anzahl der Elemente zu erhalten in queue
.
Habe ich Recht?
Nein, das würde tatsächlich zu einem Deadlock führen.
Sie müssten put
und take
synchronisieren, wenn Sie size
parallel verwenden möchten. Aber take
blockiert und Sie hätten jetzt einen blockierenden take
-Aufruf, der für dasselbe Objekt wie der put
-Aufruf synchronisiert ist. take
kann nicht dauern bis etwas put
ist. put
kann nicht gesetzt werden, bis take
die Sperre aufgibt. Das ist ein Deadlock.
Die Verwendung von "reservations" ist ein gutes Domain-Design, da es viel aussagekräftiger ist als die Größe. Sie können damit ein Domain-Konzept wie die Gesamtzahl der verfügbaren Reservierungen usw. definieren.
Auf der Leistungsseite
ArrayBlockingQueue - Aufruf der Funktion size führt zu Langsamkeit, da die Sperre aktiviert wird, um die Größe zu lesen, und die Operation verlangsamt oder verzögert wird.
LinkedBlockingQueue - Die Aufrufgröße ist ein atomarer / flüchtiger Lesevorgang und verursacht Leistungseinbußen.
Tags und Links java multithreading concurrency