Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8309688

Data race on java.io.ClassCache$CacheRef.strongReferent

    XMLWordPrintable

Details

    • Enhancement
    • Resolution: Fixed
    • P4
    • 22
    • 11, 17, 18, 19, 20, 21, 22
    • core-libs

    Description

      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.

      Attachments

        Issue Links

          Activity

            People

              manc Man Cao
              manc Man Cao
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: