我有一个jstack转储,看似说,有几个线程获得了同一个对象的锁。据我所知,这是不可能的,但是吗?几个线程可能在同一个对象上等待吗?
下面是用try块内的关键等待调用的代码:
protected boolean waitMaxWaitingTime(UserInfo aUserInfo) throws EventServiceException {
final int theMaxWaitingTime = myConfiguration.getMaxWaitingTime();
if(theMaxWaitingTime <= 0) {
return true;
}
if(aUserInfo.isEventsEmpty()) {
//monitor for event notification and double checked
synchronized(aUserInfo) {
if(aUserInfo.isEventsEmpty()) {
try {
final long theStartTime = System.currentTimeMillis();
// --- THE CRUCIAL WAIT CALL ---
aUserInfo.wait(theMaxWaitingTime);
return (System.currentTimeMillis() - theStartTime >= theMaxWaitingTime);
} catch(InterruptedException e) {
throw new EventServiceException("Error on waiting max. waiting time!", e);
}
}
}
}
return false;
}
而这里的jstack转储(选择):
"thread-79" #161 daemon prio=5 os_prio=0 tid=0x000000005d63c000 nid=0x322c in Object.wait() [0x000000007e93c000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at de.novanic.eventservice.service.connection.strategy.connector.ConnectionStrategyServerConnectorAdapter.waitMaxWaitingTime(ConnectionStrategyServerConnectorAdapter.java:92)
- locked <0x000000008b8de758> (a de.novanic.eventservice.service.registry.user.UserInfo)
"thread-77" #159 daemon prio=5 os_prio=0 tid=0x000000005d63a800 nid=0x5384 in Object.wait() [0x000000007e83c000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at de.novanic.eventservice.service.connection.strategy.connector.ConnectionStrategyServerConnectorAdapter.waitMaxWaitingTime(ConnectionStrategyServerConnectorAdapter.java:92)
- locked <0x000000008b8de758> (a de.novanic.eventservice.service.registry.user.UserInfo)
"thread-74" #156 daemon prio=5 os_prio=0 tid=0x000000006efe6000 nid=0x4828 in Object.wait() [0x000000007e25c000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at de.novanic.eventservice.service.connection.strategy.connector.ConnectionStrategyServerConnectorAdapter.waitMaxWaitingTime(ConnectionStrategyServerConnectorAdapter.java:92)
- locked <0x000000008b8de758> (a de.novanic.eventservice.service.registry.user.UserInfo)
正如你所看到的,有几个不同的线程(会通过名称和tid线程ID,在此线程中thread-79
和thread-74
)明显获得了对同一个UserInfo对象(0x000000008b8de758)的锁定并对其调用wait。我是否错误或有几个线程真的获得了锁,并称之为等待一个对象?
'if'应该是'while'。 – EJP
除非'aUserInfo.isEventsEmpty()'具有[ “之前发生”](https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5 )约束。你不能使用DCL。只要“发生之前”约束被填充,JVM就可以自由地重新排序指令。换句话说,在没有处理所有假定的操作的情况下,您的情况可能是真的。例如:设置一个属性后,您将布尔值设置为true。JVM可以在设置属性之前设置布尔值,甚至可以分配属性,将布尔值设置为true,最后处理实例初始化(构造函数调用)。 – LoganMzz
@EJP并且'return'必须在循环之后完成;) – LoganMzz