2012-04-19 116 views
2

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

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

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

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

原因之一挂是如果SDK方法进行呼叫时,在不同的线程,到在同一“someObject”同步的另一种方法,但事实并非如此。

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

+0

请详细说明您打电话的方法,根本没有足够的信息,可能是死锁或其他问题。 – 2012-04-19 09:13:02

+4

你看到它挂在哪里吗?你确定它甚至进入了同步块吗?当您不提供可编译的代码时,您正在让社区对所有这些问题感到惊叹。 – 2012-04-19 09:14:22

+0

你确定你需要在你调用该方法的同一个对象上进行同步吗?它是什么SDK方法?其他代码使用该对象? – 2012-04-19 11:55:48

回答

3

它因为创建了一个称为“死锁”的条件而挂起。问题是一个同步方法当时只能被一个线程访问。因此,您的方法正在访问此同步方法,并调用另一个线程来访问被锁定的相同方法。所以,第二个线程正在等待该函数被其他线程释放,并且这从来就不会发生。

+1

它可能是一个死锁,或者它可能是过程是仅仅因为另一个原因而悬挂,并且永远不会返回 – 2012-04-19 09:15:48

+0

你正在解释这个人明显知道的东西。 – 2012-04-19 09:17:02

+1

关于死锁概念的更多细节,请看用餐哲学家问题。 – 2012-04-19 09:17:37

0

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