On Dec 6, 2014, at 1:30 PM, Peter Levart <peter.lev...@gmail.com> wrote: > Now what scares me (might be that I don't have an intimacy with LambdaForm > class like you do). There is a situation where you publish LambdaForm > instances via data race. > > One form of LambdaForm.transformCache is an array of Transform objects (the > other two forms are not problematic). Transform class has all fields final > except the 'referent' field of SoftReference, which holds a LambdaForm > instance. In the following line: > > 377 ta[idx] = key; > > > ...you publish Transform object to an element of array with relaxed write, > and in the following lines: > > 271 } else { > 272 Transform[] ta = (Transform[])c; > 273 for (int i = 0; i < ta.length; i++) { > 274 Transform t = ta[i]; > 275 if (t == null) break; > 276 if (t.equals(key)) { k = t; break; } > 277 } > 278 } > 279 assert(k == null || key.equals(k)); > 280 return (k != null) ? k.get() : null; > > > ...you obtain the element of the array with no synchronization and a relaxed > read and might return a non-null referent (the LambdaForm) which is then > returned as an interned instance. >
Transform still has final fields, thus when constructing a Transform using "key.withResult(form))" i don't think hotspot will reorder the store of the referent, or dependent stores, so that they occur after publication of the key element into the Transform[] array. So i think things are also are ok between putInCache and getInCache. > So can LambdaForm instances be published via data races without fear that > they would appear half-initialized? > AFAICT yes. LambdaForm has final/stable fields and i presume it does not leak in the constructor (even when compiling on construction). See also MethodHandle.updateForm for rare cases where the lambda form of a MethodHandle is updated. Paul. > That's what I didn't know when I used a lazySet coupled with volatile get to > access array elements in my version: > > http://cr.openjdk.java.net/~plevart/misc/LambdaFormEditor.WeakCache/webrev.01/ > > > Regards, Peter
signature.asc
Description: Message signed with OpenPGP using GPGMail
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev