On 26.02.2014 10:19, Mandy Chung wrote:

On 2/25/2014 1:46 PM, Ivan Gerasimov wrote:

line 61:  I think the test should be:
   if (thread.reference != null || thread.actual < TIMEOUT)

Sorry, I'm not clear why.
We have two threads:
1) The lucky one gets non-null reference when it calls remove(). For this thread the actual time it had spent on waiting may be much less than 1 sec timeout. 2) The one which receives null from remove(). The amount of time it should have waited before returning from remove() should not be less than timeout.


I missed that you remove the strong reference (line 57). I think it's good to hold the strong reference so that ReferenceQueue.remove(timeout) will timeout and the test can verify reliably.

This is an important part.
If we didn't remove the strong reference then both threads would wait for the specified period of time even without the fix. The point is to make both threads wake up from lock.wait(timeout), and we do it by removing the strong reference and forcing it be enqueued.

Sincerely yours,
Ivan

Perhaps once you check the EarlyTimeout threads (both should timeout with null reference), you can clear the referent and call System.gc() and then verify if queue.remove(longTimeout) should not block as the reference should be enqueued for removal.

Mandy

That's what we should check here:
if the thread is not the lucky one (reference == null), we make sure it spent whole second waiting in remove().

Please find the slightly updated version of webrev here:
http://cr.openjdk.java.net/~igerasim/6853696/2/webrev/
I didn't change the if () clause, as I'm not yet sure why it should be done.




Reply via email to