我们有一个基于多线程java的corba服务器应用程序,其中一个线程负责接收通过corba调用从其他应用程序发送的通知。
问题是通过负责发送的应用程序正在发送通知而未处理通知。
我使用jstack进行了几次线程转储,并在所有jstack中观察到处于相同WAITING状态的以下线程。我知道第一个由VC代理创建的工作线程的线程将发出第二个线程(NotificationConsumer线程)的信号。但我怀疑的是第一个线程(如下所示),它在一个对象监视器上处于WAITING状态,可能在一个unix进程上,该进程跨越了receiveBatchEvent()方法。如果unix进程变得不存在,那么线程会永远处于WAITING模式吗?
"VBJ ThreadPool Worker id=4 se=unsecure scm=iiop_tp orb=419d05" daemon prio=3 tid=0x087c3c00 lwp=62 nid=0x3e in Object.wait() [0xea6ee000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at java.lang.UNIXProcess.waitFor(UNIXProcess.java:115)
- locked <0xf3495028> (a java.lang.UNIXProcess)
at com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer.receiveBatchEvent(Unknown Source)
at com.ericsson.nms.cif.na.server.SequencePushConsumerImpl.push_structured_events(SequencePushConsumerImpl.java:45)
at org.omg.CosNotifyComm.SequencePushConsumerPOA._invoke(SequencePushConsumerPOA.java:60)
at org.omg.CosNotifyComm.SequencePushConsumerPOA._invoke(SequencePushConsumerPOA.java:40)
at com.inprise.vbroker.poa.POAImpl.invoke(Unknown Source)
at com.inprise.vbroker.poa.ActivationRecord.invoke(Unknown Source)
at com.inprise.vbroker.GIOP.GiopProtocolAdapter.doRequest(Unknown Source)
at com.inprise.vbroker.IIOP.ServerProtocolAdapter.doRequest(Unknown Source)
at com.inprise.vbroker.GIOP.GiopProtocolAdapter.dispatchMessage(Unknown Source)
at com.inprise.vbroker.orb.TPDispatcherImpl$TPDispatcher.run(Unknown Source)
at com.inprise.vbroker.orb.ThreadPool$PoolWorker.run(Unknown Source)
-----------------------------------------------------------------------------------
nid=0x28 in Object.wait() [0xeae9d000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer$NotificationConsumer.synchronizedWait(Unknown Source)
- locked <0xf32815a0> (a com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer$NotificationConsumer)
at com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer$NotificationConsumer.run(Unknown Source)
at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
- None
答案 0 :(得分:1)
等待锁定的Java线程将无限期地等待,直到锁定被释放,是的。它将等待Java锁,而不是直接涉及UNIX进程的任何东西。如果在某个地方产生synchronized
块或方法产生UNIX进程,那么它将归结为该块或方法中的任何代码,如果UNIX进程死亡会发生什么,但肯定会可以让代码永远阻止。
如果您有类似
的内容public class SomeClass {
public synchronized void methodA() {
while (true) {
//do nothing
}
}
public synchronized void methodB() {
//do something useful
}
}
并且一个线程在methodA()
的实例上调用SomeClass
,它将获取锁,并且永远不会释放它。如果第二个线程试图在同一个实例上调用methodB()
,它将永远阻止,因为它无法获得锁定。
当你编写synchronized
块时,它们应该尽可能短而快,这一点至关重要,并且应该非常仔细地检查它们以确保它们始终终止。< / p>