-
Enhancement
-
Resolution: Fixed
-
P4
-
11, 17, 18, 19, 20, 21, 22
The TSAN checker (https://wiki.openjdk.org/display/tsan) reports data race on java.io.ClassCache$CacheRef.strongReferent, which was introduced in JDK-8280041. The stack trace below are based on JDK 11.0.16.1:
WARNING: ThreadSanitizer: data race (pid=6734)
Read of size 4 at 0x0000cdcd9d64 by thread T1587:
#0 java.io.ClassCache$CacheRef.getStrong()Ljava/lang/Object; ClassCache.java:55
#1 java.io.ClassCache.get(Ljava/lang/Class;)Ljava/lang/Object; ClassCache.java:90
#2 java.io.ObjectStreamClass.lookup(Ljava/lang/Class;Z)Ljava/io/ObjectStreamClass; ObjectStreamClass.java:336
#3 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1125
#4 java.io.ObjectOutputStream.defaultWriteFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1543
#5 java.io.ObjectOutputStream.writeSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1500
#6 java.io.ObjectOutputStream.writeOrdinaryObject(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V ObjectOutputStream.java:1423
#7 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1169
#8 java.io.ObjectOutputStream.writeObject(Ljava/lang/Object;)V ObjectOutputStream.java:345
...
Previous write of size 4 at 0x0000cdcd9d64 by thread T1589:
#0 java.io.ClassCache$CacheRef.clearStrong()V ClassCache.java:59
#1 java.io.ClassCache.get(Ljava/lang/Class;)Ljava/lang/Object; ClassCache.java:92
#2 java.io.ObjectStreamClass.lookup(Ljava/lang/Class;Z)Ljava/io/ObjectStreamClass; ObjectStreamClass.java:336
#3 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1125
#4 java.io.ObjectOutputStream.defaultWriteFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1543
#5 java.io.ObjectOutputStream.writeSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1500
#6 java.io.ObjectOutputStream.writeOrdinaryObject(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V ObjectOutputStream.java:1423
#7 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1169
#8 java.io.ObjectOutputStream.writeObject(Ljava/lang/Object;)V ObjectOutputStream.java:345
...
Update: during code review, we have determined this race is benign, and fixing it could introduce performance penalty (particularly on aarch64). Thus, we leave this data race as-is, and just document it in the source.
WARNING: ThreadSanitizer: data race (pid=6734)
Read of size 4 at 0x0000cdcd9d64 by thread T1587:
#0 java.io.ClassCache$CacheRef.getStrong()Ljava/lang/Object; ClassCache.java:55
#1 java.io.ClassCache.get(Ljava/lang/Class;)Ljava/lang/Object; ClassCache.java:90
#2 java.io.ObjectStreamClass.lookup(Ljava/lang/Class;Z)Ljava/io/ObjectStreamClass; ObjectStreamClass.java:336
#3 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1125
#4 java.io.ObjectOutputStream.defaultWriteFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1543
#5 java.io.ObjectOutputStream.writeSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1500
#6 java.io.ObjectOutputStream.writeOrdinaryObject(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V ObjectOutputStream.java:1423
#7 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1169
#8 java.io.ObjectOutputStream.writeObject(Ljava/lang/Object;)V ObjectOutputStream.java:345
...
Previous write of size 4 at 0x0000cdcd9d64 by thread T1589:
#0 java.io.ClassCache$CacheRef.clearStrong()V ClassCache.java:59
#1 java.io.ClassCache.get(Ljava/lang/Class;)Ljava/lang/Object; ClassCache.java:92
#2 java.io.ObjectStreamClass.lookup(Ljava/lang/Class;Z)Ljava/io/ObjectStreamClass; ObjectStreamClass.java:336
#3 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1125
#4 java.io.ObjectOutputStream.defaultWriteFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1543
#5 java.io.ObjectOutputStream.writeSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V ObjectOutputStream.java:1500
#6 java.io.ObjectOutputStream.writeOrdinaryObject(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V ObjectOutputStream.java:1423
#7 java.io.ObjectOutputStream.writeObject0(Ljava/lang/Object;Z)V ObjectOutputStream.java:1169
#8 java.io.ObjectOutputStream.writeObject(Ljava/lang/Object;)V ObjectOutputStream.java:345
...
Update: during code review, we have determined this race is benign, and fixing it could introduce performance penalty (particularly on aarch64). Thus, we leave this data race as-is, and just document it in the source.
- relates to
-
JDK-8280041 Retry loop issues in java.io.ClassCache
- Closed