Two stuck threads in synchronized method - at least it seems like
from a stack trace
hi,
from the stack trace it seems like there are two different threads in
synchronized method but how could it be possible ?
public class DBQuery{
private static DBQuery dbQuery = null;
public static DBQuery getInstance()
{
if (dbQuery == null) {
dbQuery = new DBQuery();
}
return dbQuery;
}
public synchronized void saveAuditVersion(boolean fIncrementVersion)
{
try{
doSQLStatement(sql); //line 332
}
catch(SQLException sqle){... }
finally { ...}
if(fIncrementVersion){
refData.setAuditVersion(refData.getAuditVersion()+1); //line 348
......
}
public static doSQLStatement(String sql){....}
}
Thread-159 "[STUCK] ExecuteThread: '12' for queue:
'weblogic.kernel.Default (self-tuning)'" <alive, in native,
priority=1, DAEMON> {
jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
jrockit.net.SocketNativeIO.socketRead(Unknown Source)
java.net.SocketInputStream.socketRead0(SocketInputStream.java:???)
java.net.SocketInputStream.read(SocketInputStream.java:129)
oracle.net.ns.Packet.receive(Unknown Source)
oracle.net.ns.NSProtocol.connect(Unknown Source)
oracle.jdbc.ttc7.TTC7Protocol.connect(TTC7Protocol.java:1689)
oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:215)
^-- Holding lock: oracle.jdbc.ttc7.TTC7Protocol@295b96a[thin lock]
oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:
360)
oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:
521)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:325)
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[recursive lock]
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[fat lock]
org.apache.commons.sql.util.DataSourceWrapper.getConnection(DataSourceWrapper.java:
117)
com.xx.util.DBConnection.connect(DBConnection.java:80)
com.xx.server.DBQuery.doSqlGetmultColumns(DBQuery.java:7242)
com.xx.server.DBQuery.doSqlGetmultColumns(DBQuery.java:7219)
com.xx.server.DBQuery.loadAuditVersion(DBQuery.java:275)
com.xx.RefData.getAuditVersion(RefData.java:394)
com.xx.server.DBQuery.saveAuditVersion(DBQuery.java:348)
^-- Holding lock: com.xx.DBQuery@d903876[fat lock]
com.xx.checkSchedule(TestAction.java:904)
Thread-160 "[STUCK] ExecuteThread: '13' for queue:
'weblogic.kernel.Default (self-tuning)'" <alive, in native,
priority=1, DAEMON> {
jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
jrockit.net.SocketNativeIO.socketRead(Unknown Source)
java.net.SocketInputStream.socketRead0(SocketInputStream.java:???)
java.net.SocketInputStream.read(SocketInputStream.java:129)
oracle.net.ns.Packet.receive(Unknown Source)
oracle.net.ns.NSProtocol.connect(Unknown Source)
oracle.jdbc.ttc7.TTC7Protocol.connect(TTC7Protocol.java:1689)
oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:215)
^-- Holding lock: oracle.jdbc.ttc7.TTC7Protocol@10ea675f[thin lock]
oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:
360)
oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:
521)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:325)
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[recursive lock]
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[fat lock]
org.apache.commons.sql.util.DataSourceWrapper.getConnection(DataSourceWrapper.java:
117)
com.xx.util.DBConnection.connect(DBConnection.java:80)
com.xx.server.DBQuery.doSQLStatement(DBQuery.java:7160)
com.xx.server.DBQuery.saveAuditVersion(DBQuery.java:332)
^-- Holding lock: com.xx.server.DBQuery@d903876[fat lock]
com.xx.checkSchedule(TestAction.java:904)
just to clarify:
DBQuery is although not thread-safe initialized singleton class.
DBConnection is an utility class with no synchronized methods.
As i understand from the stacktrace both threads reference the same
memory address and hold the lock
^-- Holding lock: com.xx.server.DBQuery@d903876[fat lock]
in such a case and excluding any calls to wait() (there is not any)
how is it possible that stack trace shows something as above?