Hello,
I am using the tomcat jdbc connection pool independently in my web
application which is deployed on glassfish web server. While performing a
database operation, our application goes into a deadlock state. The two
threads involved in the deadlock have the below traces (from a thread dump)
"thread1" Id=534 WAITING on
java.util.concurrent.locks.ReentrantReadWriteLock$FairSync@184ffd83 owned
by "thread2" Id=529
at sun.misc.Unsafe.park(Native Method)
- waiting on
java.util.concurrent.locks.ReentrantReadWriteLock$FairSync@184ffd83
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.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:945)
at
com.sun.ejb.containers.CMCSingletonContainer._getContext(CMCSingletonContainer.java:142)
at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2528)
...
Number of locked synchronizers = 1
- java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync@3f88774b
, "thread2" Id=529 WAITING on
java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync@3f88774bowned
by "thread1" Id=534
at sun.misc.Unsafe.park(Native Method)
- waiting on
java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync@3f88774b
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.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:945)
at
org.apache.tomcat.jdbc.pool.PooledConnection.lock(PooledConnection.java:609)
at
org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:752)
...
Number of locked synchronizers = 1
- java.util.concurrent.locks.ReentrantReadWriteLock$FairSync@184ffd83
Having a look at the source code for both
<http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_34/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java>of
these
<http://grepcode.com/file/repo1.maven.org/maven2/org.glassfish.ejb/ejb-container/3.1.1/com/sun/ejb/containers/CMCSingletonContainer.java?av=f>
I
see different lock instances but still the dump indicates that they are the
same. Any idea on how can the java.util.lock instances be the same?
Thanks,
Amit.