[9] RFR(S): 8005873: JRuby test_respond_to.rb asserts with: MT-unsafe modification of inline cache

Paul Sandoz paul.sandoz at oracle.com
Fri May 16 15:22:04 UTC 2014


On May 16, 2014, at 5:05 PM, Remi Forax <forax at univ-mlv.fr> wrote:

> 
> On 05/16/2014 01:56 PM, Tobias Hartmann wrote:
>> Hi,
>> 
>> thanks to everyone for the feedback.
>> 
>> Is it sufficient then to use synchronized (lambdaForms) { ... } in setCachedLambdaForm(..) and a normal read in cachedLambdaForm(..)?
>> 
>> Thanks,
>> Tobias
> 
> no, it's not,
> The memory model doesn't guarantee that a normal read will see that another thread has changed the array item,
> the normal read may always see null.
> 
> You need a synchronized block around the normal read.
> 

I don't think that is required since the pattern is:

  form = cachedLambdaForm(which);
  if (form != null) return form
  ... 
  form = /new form/
  ...
  form = setCachedLambdaForm(which, form);
  return form;

and the setCachedLambdaForm will, within it's the synchronized block, first perform a read to check if there is already a non-default value present.
 
Paul.



More information about the core-libs-dev mailing list