Kann ich Collection.size () verwenden, um den Zähler in diesem Code zu ersetzen?

8

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?

    
user2916610 23.11.2015, 05:38
quelle

2 Antworten

5

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.

    
djechlin 23.11.2015, 05:51
quelle
0

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.

    
Ashkrit Sharma 23.11.2015 15:08
quelle