2

我对这件事很好奇。我有一些代码,在一个同步块中,
它调用一个 SDK 方法,但它挂起。

synchronized(someObject) {
   someSDKobj.someMethd();
}

如果我从未同步的块中进行相同的调用,它会正确执行。

//synchronized(someObject) 
{
   someSDKobj.someMethd();
}

挂起的一个原因是,如果 sdk 方法在不同的线程上调用另一个在同一个“someObject”上同步的方法,但事实并非如此。

还有什么可能导致这种奇怪的现象?为什么被调用的方法会受到从同步块调用的事实的影响?如果重要的话,这是在 Java-ME 上运行的。

4

2 回答 2

3

它挂起是因为您创建了一个称为“死锁”的条件。问题是同步方法一次只能由一个线程访问。因此,您的方法正在访问此同步方法,并调用另一个线程来访问相同的方法,该方法已锁定。因此,第二个线程正在等待另一个线程释放该函数,而这永远不会发生。

于 2012-04-19T09:11:03.377 回答
0

挂起时获取线程转储。这应该可以肯定地告诉您 JVM 的每个线程中发生了什么,包括指出任何锁争用。

于 2012-04-19T13:44:18.097 回答