[concurrency-interest] Is Reference.reachabilityFence() needed in Reference constructor?

Vitaly Davidovich vitalyd at gmail.com
Wed Oct 21 17:18:08 UTC 2015


>
> queue is marked volatile, so a simple reordering of the lines should be
> just as effective:
>      Reference(T referent, ReferenceQueue<? super T> queue) {
>          this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
>          this.referent = referent;
>      }


Won't mean much since the plain referent store can move above the queue
store.

On Wed, Oct 21, 2015 at 1:10 PM, Rezaei, Mohammad A. <Mohammad.Rezaei at gs.com
> wrote:

> >> Might the following be needed or not:
> >>
> >>     Reference(T referent, ReferenceQueue<? super T> queue) {
> >>         this.referent = referent;
> >>         this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
> >>         reachabilityFence(referent);
> >>     }
> >
>
> queue is marked volatile, so a simple reordering of the lines should be
> just as effective:
>
>      Reference(T referent, ReferenceQueue<? super T> queue) {
>          this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
>          this.referent = referent;
>      }
>
> A simplistic interpretation of GC (as for example seen here:
> http://stackoverflow.com/questions/10795505/how-do-garbage-collectors-know-about-references-on-the-stack-frame
> ) might lead one to believe that referent is reachable until the end of the
> constructor because it's in the stack frame. The point at which
> reachability analysis kicks in, in the middle of such a simple two liner
> and removes the referent from the stack (or other variations such as
> inlining) is presumably highly implementation dependent and should not be
> relied on, but I'm guessing that's the reason you're not able to reproduce
> an early GC.
>
> Thanks
> Moh
>



More information about the core-libs-dev mailing list