为什么我的代码会挂起?

时间:2012-04-19 09:07:55

标签: java multithreading java-me synchronized

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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