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

(coll) Concurrent Hashtable.equals deadlocks

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Fix
    • Icon: P4 P4
    • None
    • 6
    • core-libs

        FULL PRODUCT VERSION :
        java version "1.6.0_01"
        Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
        Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)

        ADDITIONAL OS VERSION INFORMATION :
        Linux localhost 2.6.21-1.3194.fc7 #1 SMP Wed May 23 22:35:01 EDT 2007 i686 i686 i386 GNU/Linux

        A DESCRIPTION OF THE PROBLEM :
        Properties.equal deadlocks if two threads simultaneously call equals between two Properties objects.

        The javadoc for Properties states that this class is thread-safe:
        http://java.sun.com/javase/6/docs/api/java/util/Properties.html


        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        Run example code.

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        Sample code run indefinitely.
        ACTUAL -
          Program exits and prints:
         
           java.util.Hashtable.get(Hashtable.java:333)
            java.util.Hashtable.equals(Hashtable.java:755)
            PropertyBagDeadlock$1.run(PropertyBagDeadlock.java:31)

            java.util.Hashtable.size(Hashtable.java:206)
            java.util.Hashtable.equals(Hashtable.java:742)
            PropertyBagDeadlock$2.run(PropertyBagDeadlock.java:44)


        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        import java.lang.management.ManagementFactory;
        import java.lang.management.ThreadMXBean;
        import java.util.Properties;


        public class PropertyBagDeadlock
        {
           public static void main(String[] args)
           {
              final Properties p1 = new Properties();
              p1.put("1", new Object());
              p1.put("2", new Object());
              p1.put("3", new Object());
              
              final Properties p2 = new Properties();
              p2.put("1", new Object());
              p2.put("2", new Object());
              p2.put("3", new Object());
              
              Thread t1 = new Thread()
              {
                 @Override
                 public void run()
                 {
                    while(true)
                    {
                       p1.equals(p2);
                    }
                 }
              };
              t1.start();
              
              Thread t2 = new Thread()
              {
                 @Override
                 public void run()
                 {
                    while(true)
                    {
                       p2.equals(p1);
                    }
                 }
              };
              t2.start();
              
              while(true)
              {
                 try
                 {
                    Thread.sleep(1000);
                    ThreadMXBean manager = ManagementFactory.getThreadMXBean();
                    long[] deadlockedThreads = manager.findMonitorDeadlockedThreads();
                    if (deadlockedThreads != null && deadlockedThreads.length > 0)
                    {
                       printStack(t1);
                       printStack(t2);
                       System.exit(0);
                    }
                 }
                 catch (InterruptedException e)
                 {
                 }
              }
           }
           
           private static void printStack(Thread t)
           {
              StringBuilder buf = new StringBuilder();
              StackTraceElement[] stack = t.getStackTrace();
              for(int j = 0; j < stack.length; j++)
              {
                 buf.append(" ");
                 buf.append(stack[j].toString());
                 buf.append("\n");
              }
              System.err.println(buf);
           }
        ---------- END SOURCE ----------

              rriggs Roger Riggs
              ndcosta Nelson Dcosta (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: