16个线程等待同一个锁
Posted
技术标签:
【中文标题】16个线程等待同一个锁【英文标题】:16 threads waiting the same lock 【发布时间】:2018-10-07 14:40:38 【问题描述】:我在 glassfish 3 服务器中遇到问题。日志正在抛出消息
java.util.concurrent.RejectedExecutionException:线程池的任务队列已满,限制:256
我做了几次线程转储,发现有16个线程在等待同一个锁,例如:
“__ejb-thread-pool1”守护进程prio=6 tid=0x39657c00 nid=0x1c08 等待条件[0x3297f000] java.lang.Thread.State:等待(停车) 在 sun.misc.Unsafe.park(本机方法) - 停车等待 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 在 java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 在 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 在 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:724)
锁定的可拥有同步器: - 无
"__ejb-thread-pool2" 守护进程 prio=6 tid=0x38408c00 nid=0x1a3c 等待条件 [0x3ad3f000] java.lang.Thread.State:等待(停车) 在 sun.misc.Unsafe.park(本机方法) - 停车等待 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 在 java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 在 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 在 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:724)
锁定的可拥有同步器: - 没有 ...
这正常吗?我以为我会在线程转储中找到一个拥有锁的线程,但没有。请帮助..我是线程分析的新手。
【问题讨论】:
为什么所有池的条件参考都相同?是静态的吗? http-thread-pool-80 有 5 个线程也在等待另一个相同的监视器。并且 admin-thread-pool-4848 的线程正在锁定同一个监视器。我不明白 注意:他们正在等待一个条件,而不是一个锁。 16 个线程都在争用同一个互斥锁表示存在严重问题,但 16 个工作线程都在等待一个条件,因为没有可用的工作可供他们做,这可能只是一切照旧。 【参考方案1】:如果某个执行器服务有 16 个线程无所事事,那么是的,它们都在等待任务队列中显示的内容是完全正常的。
被拒绝的执行可能发生在您快照线程时的另一个时刻。这只意味着提交数量激增,队列提前溢出。
但请注意,这些被拒绝的执行甚至可能不在您正在查看的执行器服务上。这取决于其他地方还有多少其他执行器服务。
【讨论】:
以上是关于16个线程等待同一个锁的主要内容,如果未能解决你的问题,请参考以下文章