I am running a simple program which causes deadlock.
final String resource1 = "santanu";
final String resource2 = "sahoo";
System.out.println(Integer.toHexString(resource1.hashCode()) );
System.out.println(Integer.toHexString(resource2.hashCode()) );
Thread t1 = new Thread(){
public void run()
{
synchronized (resource1) {
System.out.println("Thread 1: locked resource 1");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resource2) {
System.out.println("Thread 1: locked resource 2");
}
}
}
};
Thread t2 = new Thread(){
public void run()
{
synchronized (resource2) {
try {
System.out.println("Thread 2: locked resource 2");
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};
t1.start();
t2.start();
Below is the expected output
6f3700d4
6823b3a
Thread 1: locked resource 1
Thread 2: locked resource 2
Now I fired jps command and found the PID for this java program and using jconsole <pid>
command to view the deadlock.
Below is the stack trace in jconsole
Name: Thread-1
State: BLOCKED on java.lang.String@4ad61aef owned by: Thread-0
Total blocked: 1 Total waited: 1
Stack trace:
com.cmc.santanusol$2.run(santanusol.java:49)
- locked java.lang.String@4406cef4
Now my question is why jconsole stacktrace displaying different object's HexString ( java.lang.String@ )comparing to the values i am printing in first two sysout ?
More precisely why 6f3700d4 and 6823b3a values did not appear in jconsole output ?