Discussion: JDK-8160710 Enable Thread to grant VarHandle field access to ThreadLocalRandom/Striped64

Peter Levart peter.levart at gmail.com
Thu Jul 7 15:22:56 UTC 2016


Hi,


On 07/01/2016 10:36 AM, Paul Sandoz wrote:
>> On 1 Jul 2016, at 00:53, Doug Lea <dl at cs.oswego.edu> wrote:
>>
>> On 06/30/2016 10:08 AM, Paul Sandoz wrote:
>>> Hi Peter,
>>>
>>> Thanks, that’s interesting. I am uncertain if our 166 fellows will be
>>> reluctant or not to pull in a dependency on jdk.internal.misc.SharedSecrets.
>>
>> Background: we are reluctant to rely on anything that makes sources impossible
>> to use in (usually, upcoming versions of) Android. Which probably
>> doesn't directly apply here.
>>
>> But my main concern in this case is that we need better assurance
>> that there are no possible start-up circularities, since we've already
>> had some near-miss experiences with ThreadLocalRandom. Is there a
>> solid argument?

ThreadLocalRandom was tricky, yes!

But I think this one is pretty safe:

http://cr.openjdk.java.net/~plevart/misc/JavaLangThreadAccess/webrev.Striped64/

What it does in Thread.<clinit> is instantiate an anonymous class 
implementing JavaLangThreadAccess interface and injecting the instance 
into the SharedSecrets class' static field. This triggers initializing 
just 3 classes:

- JavaLangThreadAccess interface
- Thread$NN anonymous class implementing JavaLangThreadAccess
- SharedSecrets class

That's all. The patch modifies SharedSecrets so that it doesn't 
initialize anything else (originally it initialized the Unsafe class 
which was premature and the JVM bootstrap failed because of that).

This is the diff between the traces of loading classes on unpatched JDK 
9  (jsr166 jdk9 integration wave 7 not applied yet) and with above patch 
applied when running an empty program:

[peter at peterl tmp]$ diff -c cltrace0.txt cltrace1.txt
*** cltrace0.txt        2016-07-07 17:04:21.872277904 +0200
--- cltrace1.txt        2016-07-07 17:04:26.368307983 +0200
***************
*** 1,4 ****
! [info][class,load] opened: /home/peter/Apps64/jdk1.9.0.default/lib/modules
   [info][class,load] java.lang.Object source: jrt:/java.base
   [info][class,load] java.io.Serializable source: jrt:/java.base
   [info][class,load] java.lang.Comparable source: jrt:/java.base
--- 1,4 ----
! [info][class,load] opened: 
/home/peter/work/hg/jdk9-dev/build/linux-x86_64-normal-server-release/images/jdk/lib/modules
   [info][class,load] java.lang.Object source: jrt:/java.base
   [info][class,load] java.io.Serializable source: jrt:/java.base
   [info][class,load] java.lang.Comparable source: jrt:/java.base
***************
*** 123,128 ****
--- 123,131 ----
   [info][class,load] java.security.BasicPermission source: jrt:/java.base
   [info][class,load] java.lang.RuntimePermission source: jrt:/java.base
   [info][class,load] java.lang.StringLatin1 source: jrt:/java.base
+ [info][class,load] jdk.internal.misc.JavaLangThreadAccess source: 
jrt:/java.base
+ [info][class,load] java.lang.Thread$2 source: jrt:/java.base
+ [info][class,load] jdk.internal.misc.SharedSecrets source: jrt:/java.base
   [info][class,load] java.security.AccessController source: jrt:/java.base
   [info][class,load] java.util.Collections source: jrt:/java.base
   [info][class,load] java.lang.Iterable source: jrt:/java.base
***************
*** 167,173 ****
   [info][class,load] java.lang.ref.ReferenceQueue$Lock source: 
jrt:/java.base
   [info][class,load] jdk.internal.misc.JavaLangRefAccess source: 
jrt:/java.base
   [info][class,load] java.lang.ref.Reference$1 source: jrt:/java.base
- [info][class,load] jdk.internal.misc.SharedSecrets source: jrt:/java.base
   [info][class,load] java.lang.Class$Atomic source: jrt:/java.base
   [info][class,load] java.lang.reflect.ReflectPermission source: 
jrt:/java.base
   [info][class,load] 
jdk.internal.reflect.ReflectionFactory$GetReflectionFactoryAction 
source: jrt:/java.base
--- 170,175 ----
***************
*** 389,413 ****
   [info][class,load] jdk.internal.module.SystemModules source: 
jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor source: 
jrt:/java.base
   [info][class,load] jdk.internal.module.Builder source: jrt:/java.base
   [info][class,load] jdk.internal.misc.JavaLangModuleAccess source: 
jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$1 source: 
jrt:/java.base
   [info][class,load] 
java.lang.module.ModuleDescriptor$Requires$Modifier source: jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$Requires source: 
jrt:/java.base
- [info][class,load] java.util.Collections$EmptyIterator source: 
jrt:/java.base
   [info][class,load] java.util.Collections$1 source: jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$Exports source: 
jrt:/java.base
   [info][class,load] java.util.HashMap$TreeNode source: jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$Version source: 
jrt:/java.base
   [info][class,load] java.util.ArrayList source: jrt:/java.base
- [info][class,load] java.util.Collections$UnmodifiableCollection 
source: jrt:/java.base
- [info][class,load] java.util.Collections$UnmodifiableSet source: 
jrt:/java.base
   [info][class,load] java.util.Collections$UnmodifiableMap source: 
jrt:/java.base
- [info][class,load] java.lang.module.ModuleDescriptor$Provides source: 
jrt:/java.base
   [info][class,load] java.util.HashMap$KeySet source: jrt:/java.base
   [info][class,load] java.util.HashMap$HashIterator source: jrt:/java.base
   [info][class,load] java.util.HashMap$KeyIterator source: jrt:/java.base
- [info][class,load] jdk.internal.module.ModuleHashes source: jrt:/java.base
   [info][class,load] java.util.LinkedHashSet source: jrt:/java.base
   [info][class,load] jdk.internal.module.ModuleHashes$HashSupplier 
source: jrt:/java.base
   [info][class,load] java.lang.module.SystemModuleFinder$2 source: 
jrt:/java.base
   [info][class,load] java.util.function.Supplier source: jrt:/java.base
--- 391,416 ----
   [info][class,load] jdk.internal.module.SystemModules source: 
jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor source: 
jrt:/java.base
   [info][class,load] jdk.internal.module.Builder source: jrt:/java.base
+ [info][class,load] jdk.internal.misc.SharedSecrets$U source: 
jrt:/java.base
   [info][class,load] jdk.internal.misc.JavaLangModuleAccess source: 
jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$1 source: 
jrt:/java.base
   [info][class,load] 
java.lang.module.ModuleDescriptor$Requires$Modifier source: jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$Requires source: 
jrt:/java.base
   [info][class,load] java.util.Collections$1 source: jrt:/java.base
+ [info][class,load] java.util.Collections$EmptyIterator source: 
jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$Exports source: 
jrt:/java.base
+ [info][class,load] java.util.Collections$UnmodifiableCollection 
source: jrt:/java.base
+ [info][class,load] java.util.Collections$UnmodifiableSet source: 
jrt:/java.base
   [info][class,load] java.util.HashMap$TreeNode source: jrt:/java.base
+ [info][class,load] java.lang.module.ModuleDescriptor$Provides source: 
jrt:/java.base
   [info][class,load] java.lang.module.ModuleDescriptor$Version source: 
jrt:/java.base
   [info][class,load] java.util.ArrayList source: jrt:/java.base
   [info][class,load] java.util.Collections$UnmodifiableMap source: 
jrt:/java.base
   [info][class,load] java.util.HashMap$KeySet source: jrt:/java.base
   [info][class,load] java.util.HashMap$HashIterator source: jrt:/java.base
   [info][class,load] java.util.HashMap$KeyIterator source: jrt:/java.base
   [info][class,load] java.util.LinkedHashSet source: jrt:/java.base
+ [info][class,load] jdk.internal.module.ModuleHashes source: jrt:/java.base
   [info][class,load] jdk.internal.module.ModuleHashes$HashSupplier 
source: jrt:/java.base
   [info][class,load] java.lang.module.SystemModuleFinder$2 source: 
jrt:/java.base
   [info][class,load] java.util.function.Supplier source: jrt:/java.base


...what we see is that the patch actually delays loading of some classes 
(except the 3 classes mentioned).

Regards, Peter

>>
> I suggest we spin this off from the main issue and investigate afterwards, i have logged an issue:
>
>    https://bugs.openjdk.java.net/browse/JDK-8160710 <https://bugs.openjdk.java.net/browse/JDK-8160710>
>
> Paul.



More information about the core-libs-dev mailing list