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

ReentrantLock on ConcurrentHashMap causing deadlock on serialization

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Fix
    • Icon: P3 P3
    • None
    • 6u37, 7u3, 7u45
    • core-libs

      FULL PRODUCT VERSION :
      java version "1.7.0_03"
      Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
      Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)

      java version "1.7.0_45"
      Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
      Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

      java version "1.6.0_37"
      Java(TM) SE Runtime Environment (build 1.6.0_37-b06)
      Java HotSpot(TM) Server VM (build 20.12-b01, mixed mode)




      ADDITIONAL OS VERSION INFORMATION :
      Linux 3.5.0-24-generic #37-Ubuntu x86_64 GNU/Linux

      Windows 7


      A DESCRIPTION OF THE PROBLEM :
      When a ConcurrentHashMap is being serialized and modified at the same time via separate threads a race condition can occur causing deadlock. The ReentrantLock on some of the Segments in the ConcurrentHashMap are not released causing the application to block indefinitely in the call to writeObject(). The thread dump shows the locks are held by the relative threads but the stack trace of the threads do not show where the lock was acquired. I was able to reproduce the issue with the test application on JRE1.7.0_45, JRE1.7.0_03 and JRE1.6.0_37 on both Linux and Windows machines.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Compile the test application with JRE1.7.0_45, JRE1.7.0_03 or JRE1.6.0_37.
      2. Create a script to loop the execution of the test as deadlock may not happen on first run.

      #!/bin/bash

      while :
      do
      java Test
      echo "loop";
      done

      3. Run the test loop execution script.
      4. Wait for "quit" to be displayed on standard out but not "loop" signifying that the test application did not fully exit due to user threads in deadlock.
      5. Inspect thread dump on deadlocked test application.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Execution loop continues indefinitely.
      ACTUAL -
      Execution loop halts due to deadlock on user threads in application.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      michaely@Lain:~/Desktop/test$ java -version
      java version "1.7.0_03"
      Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
      Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)
      michaely@Lain:~/Desktop/test$ ./test.sh
      quit
      loop
      quit
      2013-12-16 13:08:54
      Full thread dump Java HotSpot(TM) 64-Bit Server VM (22.1-b02 mixed mode):

      "DestroyJavaVM" prio=10 tid=0x00007f586c007800 nid=0x24f waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE

      "Thread-9" prio=10 tid=0x00007f586c11a800 nid=0x26a waiting on condition [0x00007f5864d8c000]
         java.lang.Thread.State: WAITING (parking)
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x00000007062007b8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap$Segment.scanAndLockForPut(ConcurrentHashMap.java:504)
      at java.util.concurrent.ConcurrentHashMap$Segment.put(ConcurrentHashMap.java:366)
      at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1064)
      at Test$Run3.run(Test.java:135)
      at java.lang.Thread.run(Thread.java:722)

      "Thread-5" prio=10 tid=0x00007f586c112000 nid=0x266 waiting on condition [0x00007f5865190000]
         java.lang.Thread.State: WAITING (parking)
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x00000007062007b8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap$Segment.scanAndLock(ConcurrentHashMap.java:537)
      at java.util.concurrent.ConcurrentHashMap$Segment.remove(ConcurrentHashMap.java:553)
      at java.util.concurrent.ConcurrentHashMap.remove(ConcurrentHashMap.java:1111)
      at Test$Run2.run(Test.java:112)
      at java.lang.Thread.run(Thread.java:722)

      "Thread-4" prio=10 tid=0x00007f586c110000 nid=0x265 waiting on condition [0x00007f5865291000]
         java.lang.Thread.State: WAITING (parking)
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x0000000706200b38> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap$Segment.scanAndLock(ConcurrentHashMap.java:537)
      at java.util.concurrent.ConcurrentHashMap$Segment.remove(ConcurrentHashMap.java:553)
      at java.util.concurrent.ConcurrentHashMap.remove(ConcurrentHashMap.java:1111)
      at Test$Run2.run(Test.java:112)
      at java.lang.Thread.run(Thread.java:722)

      "Thread-3" prio=10 tid=0x00007f586c10e000 nid=0x264 waiting on condition [0x00007f5865391000]
         java.lang.Thread.State: WAITING (parking)
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x00000007062007b8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1447)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at Test$Run1.run(Test.java:89)
      at java.lang.Thread.run(Thread.java:722)

      "Thread-2" prio=10 tid=0x00007f586c10c000 nid=0x263 waiting on condition [0x00007f5865492000]
         java.lang.Thread.State: WAITING (parking)
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x0000000706204210> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1447)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1454)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at Test$Run1.run(Test.java:89)
      at java.lang.Thread.run(Thread.java:722)

      "Thread-1" prio=10 tid=0x00007f586c10a000 nid=0x262 waiting on condition [0x00007f5865592000]
         java.lang.Thread.State: WAITING (parking)
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x0000000706200b38> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1447)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1454)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1454)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at Test$Run1.run(Test.java:89)
      at java.lang.Thread.run(Thread.java:722)

      "Service Thread" daemon prio=10 tid=0x00007f586c0f0800 nid=0x25f runnable [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE

      "C2 CompilerThread1" daemon prio=10 tid=0x00007f586c0ee800 nid=0x25e waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE

      "C2 CompilerThread0" daemon prio=10 tid=0x00007f586c0eb800 nid=0x25d waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE

      "Signal Dispatcher" daemon prio=10 tid=0x00007f586c0e9800 nid=0x25c waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE

      "Finalizer" daemon prio=10 tid=0x00007f586c09d000 nid=0x25b in Object.wait() [0x00007f586637e000]
         java.lang.Thread.State: WAITING (on object monitor)
      at java.lang.Object.wait(Native Method)
      - waiting on <0x0000000706202f28> (a java.lang.ref.ReferenceQueue$Lock)
      at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
      - locked <0x0000000706202f28> (a java.lang.ref.ReferenceQueue$Lock)
      at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
      at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

      "Reference Handler" daemon prio=10 tid=0x00007f586c09b000 nid=0x25a in Object.wait() [0x00007f586647f000]
         java.lang.Thread.State: WAITING (on object monitor)
      at java.lang.Object.wait(Native Method)
      - waiting on <0x0000000706202888> (a java.lang.ref.Reference$Lock)
      at java.lang.Object.wait(Object.java:503)
      at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
      - locked <0x0000000706202888> (a java.lang.ref.Reference$Lock)

      "VM Thread" prio=10 tid=0x00007f586c093800 nid=0x258 runnable

      "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f586c012000 nid=0x250 runnable

      "GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f586c014000 nid=0x251 runnable

      "GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f586c016000 nid=0x252 runnable

      "GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f586c018000 nid=0x253 runnable

      "GC task thread#4 (ParallelGC)" prio=10 tid=0x00007f586c019800 nid=0x254 runnable

      "GC task thread#5 (ParallelGC)" prio=10 tid=0x00007f586c01b800 nid=0x255 runnable

      "GC task thread#6 (ParallelGC)" prio=10 tid=0x00007f586c01d800 nid=0x256 runnable

      "GC task thread#7 (ParallelGC)" prio=10 tid=0x00007f586c01f000 nid=0x257 runnable

      "VM Periodic Task Thread" prio=10 tid=0x00007f586c0fb800 nid=0x260 waiting on condition

      JNI global references: 165


      Found one Java-level deadlock:
      =============================
      "Thread-9":
        waiting for ownable synchronizer 0x00000007062007b8, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
        which is held by "Thread-1"
      "Thread-1":
        waiting for ownable synchronizer 0x0000000706200b38, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
        which is held by "Thread-2"
      "Thread-2":
        waiting for ownable synchronizer 0x0000000706204210, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
        which is held by "Thread-1"

      Java stack information for the threads listed above:
      ===================================================
      "Thread-9":
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x00000007062007b8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap$Segment.scanAndLockForPut(ConcurrentHashMap.java:504)
      at java.util.concurrent.ConcurrentHashMap$Segment.put(ConcurrentHashMap.java:366)
      at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1064)
      at Test$Run3.run(Test.java:135)
      at java.lang.Thread.run(Thread.java:722)
      "Thread-1":
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x0000000706200b38> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1447)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1454)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1454)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at Test$Run1.run(Test.java:89)
      at java.lang.Thread.run(Thread.java:722)
      "Thread-2":
      at sun.misc.Unsafe.park(Native Method)
      - parking to wait for <0x0000000706204210> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
      at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
      at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1447)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1454)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
      at Test$Run1.run(Test.java:89)
      at java.lang.Thread.run(Thread.java:722)

      Found 1 deadlock.

      Heap
       PSYoungGen total 478080K, used 368659K [0x00000007acb60000, 0x00000007fb7a0000, 0x0000000800000000)
        eden space 477952K, 77% used [0x00000007acb60000,0x00000007c3344d10,0x00000007c9e20000)
        from space 128K, 100% used [0x00000007fb780000,0x00000007fb7a0000,0x00000007fb7a0000)
        to space 256K, 0% used [0x00000007fb720000,0x00000007fb720000,0x00000007fb760000)
       PSOldGen total 170560K, used 829K [0x0000000706200000, 0x0000000710890000, 0x00000007acb60000)
        object space 170560K, 0% used [0x0000000706200000,0x00000007062cf640,0x0000000710890000)
       PSPermGen total 21248K, used 3085K [0x0000000701000000, 0x00000007024c0000, 0x0000000706200000)
        object space 21248K, 14% used [0x0000000701000000,0x00000007013034b0,0x00000007024c0000)

      ^Z
      [1]+ Stopped ./test.sh


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.io.ByteArrayOutputStream;
      import java.io.ObjectOutputStream;
      import java.util.concurrent.ConcurrentHashMap;

      public class Test {
      static volatile boolean quit;

      private static void addStuff(ConcurrentHashMap<String, Object> m) {
      for (int i = 0 ; i < 50 ; ++i) {
      Objecto = null;
      String[]sa;

      switch (i % 3) {
      case 0:
      sa = new String[10];
      for (int j = 0 ; j < 10 ; ++j)
      sa[j] = i + "_" + j;
      o = sa;
      break;

      case 1:
      o = new Integer(i);
      break;

      case 2:
      o = "s_" + i;
      break;
      }

      m.put("i" + i, o);
      }
      }

      public static void main(String[] args) {
      ConcurrentHashMap[]nested = new ConcurrentHashMap[10];
      ConcurrentHashMap<String, Object>a = new ConcurrentHashMap<String, Object>();
      ConcurrentHashMap<String, Object>b = new ConcurrentHashMap<String, Object>();

      addStuff(a);
      addStuff(b);

      for (int i = 0 ; i < nested.length ; ++i) {
      nested[i] = new ConcurrentHashMap<String, Object>();
      addStuff(nested[i]);
      a.put("a_nm" + i, nested[i]);
      b.put("b_nm" + i, nested[i]);
      }

      nested[0].put("aaa", a);

      new Thread(new Run1(a)).start();
      new Thread(new Run1(b)).start();
      new Thread(new Run1(a)).start();
      new Thread(new Run1(b)).start();

      new Thread(new Run2(a, "a")).start();
      new Thread(new Run2(b, "b")).start();

      new Thread(new Run2(nested[0], "n0")).start();
      new Thread(new Run2(nested[1], "n1")).start();

      new Thread(new Run3(a, nested[0], nested[1], "r3a")).start();
      new Thread(new Run3(b, nested[1], nested[1], "r3b")).start();

      try {
      Thread.sleep(30000);
      } catch (Exception e) {
      }

      System.out.println("quit");

      quit = true;
      }

      private static class Run1 implements Runnable {
      ConcurrentHashMapmap;

      Run1(ConcurrentHashMap m) {
      map = m;
      }

      public void run() {
      try {
      ByteArrayOutputStreambaos = new ByteArrayOutputStream();
      ObjectOutputStreamoos = new ObjectOutputStream(baos);

      while (!quit) {
      baos.reset();
      oos.writeObject(map);
      }
      } catch (Exception e) {
      throw new RuntimeException(e);
      }
      }
      }

      private static class Run2 implements Runnable {
      ConcurrentHashMapmap;
      Stringprefix;

      Run2(ConcurrentHashMap m, String p) {
      map = m;
      prefix = p;
      }

      public void run() {
      while (!quit) {
      for (int i = 0 ; i < 20 ; ++i)
      map.put(prefix + "_" + i, new Integer(i));

      for (int i = 0 ; i < 20 ; ++i)
      map.remove(prefix + "_" + i);
      }
      }
      }

      private static class Run3 implements Runnable {
      ConcurrentHashMapmap;
      Objectobj1;
      Objectobj2;
      Stringprefix;

      Run3(ConcurrentHashMap m, Object o1, Object o2, String p) {
      map = m;
      obj1 = o1;
      obj2 = o2;
      prefix = p;
      }

      public void run() {
      while (!quit) {
      map.put(prefix + "1", obj1);
      map.put(prefix + "2", obj2);

      map.put(prefix + "1", obj2);
      map.put(prefix + "2", obj1);

      map.remove(prefix + "1");
      map.remove(prefix + "2");
      }
      }
      }
      }
      ---------- END SOURCE ----------

            coffeys Sean Coffey
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

              Created:
              Updated:
              Resolved: