首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thead死锁问题

Thead死锁问题
EN

Stack Overflow用户
提问于 2015-09-11 09:19:58
回答 1查看 302关注 0票数 0

环境:

代码语言:javascript
复制
  Wildfly 8.1
  Struts
  EJB 3.1
  Postgres 9

面临线程死锁问题。希望能弄清楚。

代码:

  • 操作类使用EJB调用两个更新。

bean.writeLockedUpdate(o1) 1.bean.writeLockedUpdate(o1) #2

  • EJB的writeLockedUpdate(对象)通过JPA进行简单的JDBC更新

场景:

  • UserRequestThread1启动并完成#1,并在操作类中执行一些工作
  • UserRequestThread2启动并获得了bean上的写锁,并且在bean.writeLockedUpdate(o1)中。

试图修改的两个用户线程都是 o1对象。

这两个线程的线程转储片段:

Thread1:

“默认任务-56”#558 prio=5 os_prio=0 tid=0x724a4400 nid=0x1674等待条件为0x3d2ef000 java.lang.Thread.State: TIMED_WAITING (停车) 在org.jboss.as.ejb3.concurrency.EJBReadWriteLock$WriteLock.tryLock(EJBReadWriteLock.java:209) $$22.writeLockedUpdate(未知来源)

Thread2:

“默认任务-43”#530 prio=5 os_prio=0 tid=0x6bf10800 nid=0x15aa runnable 0x299c8000 java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(本机方法) 在org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:143) $$22.writeLockedUpdate(未知来源)

可能的解释:

我相信这就是发生了什么。

  1. thread2已经获得了bean写锁,正在等待DB行锁
  2. thread1已获得DB行锁,正在等待bean写锁。

J控制台没有显示任何死锁。猜测是因为第二个被阻塞的锁位于DB级别。

Queation:

是否有办法验证上述解释?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-11 16:30:17

从Java和postgresql DB获得确认。

  1. 线程转储清楚地显示thread1正在等待EJB写锁。
  2. 下面对postgres的查询显示了被阻塞的操作

选择bl.pid为blocked_pid,bl.mode为blocked_mode,a.usename为blocked_user,ka.query为blocking_statement,now() - ka.query_start为blocking_duration,kl.pid为blocking_pid,kl.mode为blocking_mode,ka.usename为blocking_user,a.query为ka.usename,现在()- a.query_start as blocked_duration从pg_catalog.pg_locks bl加入pg_catalog.pg_stat_activity a on bl.pid = a.pid bl.pid kl加入pg_catalog.pg_stat_activity ka on kl.pid = ka.pid on bl.transactionid = kl.transactionid和bl.pid != kl.pid where not bl.granted

在我的例子中,上面的查询返回一行,显示更新被阻塞。

谢谢,Rakesh

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32519947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档