-
Bug
-
Resolution: Won't Fix
-
P4
-
None
-
6
-
x86
-
linux
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-2183174 | 6-pool | Miroslaw Niemiec | P4 | Closed | Won't Fix |
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 ----------
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 ----------
- backported by
-
JDK-2183174 (coll) Concurrent Hashtable.equals deadlocks
-
- Closed
-