[concurrency-interest] RRWL with 'bad' Thread.getId() implementations

Chris Dennis chris.w.dennis at gmail.com
Tue Jun 25 16:27:54 EDT 2013


(Sorry for mixing top and bottom posting - hope nobody is offended!)

You'll need to blank the cachedHoldCounter when a thread releases it's
last hold as well, right?  Otherwise we still leak a reference to the last
reader to take this lock, even if that thread has unlocked fully.

On 6/25/13 4:09 PM, "Aleksey Shipilev" <aleksey.shipilev at oracle.com> wrote:

>On 06/25/2013 11:54 PM, Chris Dennis wrote:
>> In a similar vein, the following code doesn't behave like you'd expect
>> either (although it's arguable as to whether this is a reasonable way
>>for
>> RRWL to behave in this circumstance).  Note here that this is totally
>> legal per the getId() contract, because the id doesn't get recycled
>>until
>> after the join returns.
>
>Now that's a good example!
>
>This highlights the potential problem in RRWL. The code should instead
>throw the IllegalMonitorStateException in t2b.run(). I wonder what harm
>is done if we disregard the comment there and store the reference to
>Thread instead.
>
>        /**
>         * A counter for per-thread read hold counts.
>         * Maintained as a ThreadLocal; cached in cachedHoldCounter
>         */
>        static final class HoldCounter {
>            int count = 0;
>            // Use id, not reference, to avoid garbage retention
>            final long tid = Thread.currentThread().getId();
>        }
>
>        static final class ThreadLocalHoldCounter
>            extends ThreadLocal<HoldCounter> {
>            public HoldCounter initialValue() {
>                return new HoldCounter();
>            }
>        }
>
>I don't see the problem off-hand: if thread dies, so do the associated
>ThreadLocalMap-s. RRWL does not reference the live
>ThreadLocalHoldCounter when nobody is holding the read lock... What else
>is missing?
>
>-Aleksey.




More information about the Concurrency-interest mailing list