On May 16, 2014, at 5:05 PM, Remi Forax <fo...@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.