RFR (XS): 8014890 : Reference queues may return more entries than expected
Aleksey Shipilev
aleksey.shipilev at oracle.com
Wed Jun 19 14:20:10 UTC 2013
On 06/19/2013 06:09 PM, Thomas Schatzl wrote:
>> With that notion in mind, I start to wonder if we just need to move the
>> check in enqueue() down into the synchronized(lock), and extend it to
>> capture NULL:
>>
>> --- a/src/share/classes/java/lang/ref/ReferenceQueue.java Mon Jun 17
>> 16:28:22 2013 +0400
>> +++ b/src/share/classes/java/lang/ref/ReferenceQueue.java Wed Jun 19
>> 17:53:24 2013 +0400
>> @@ -56,8 +56,9 @@
>>
>> boolean enqueue(Reference<? extends T> r) { /* Called only by
>> Reference class */
>> synchronized (r) {
>> - if (r.queue == ENQUEUED) return false;
>> synchronized (lock) {
>> + if (r.queue == ENQUEUED || r.queue == NULL)
>> + return false;
>> r.queue = ENQUEUED;
>> r.next = (head == null) ? r : head;
>> head = r;
>>
>> Will it be equivalent to what Thomas is trying to accomplish?
>
> Yes, this is equivalent. Instead of checking the separate ENQUEUED and
> NULL values I simply used an "r.queue != this" check which would get
> both cases. R.queue cannot have other values than ENQUEUED, NULL or the
> queue's value set at initialization.
Yeah, for my taste, explicitly checking for ENQUEUED || NULL declares
the intent more clearly. YMMV, though. I'm OK with plumbing the hole...
your style. :)
-Aleksey.
More information about the core-libs-dev
mailing list