2012-04-19 4 views
2

나는이 일에 대해 매우 궁금해. 동기화 된 블록에 몇 가지 코드가 있습니다.
SDK 메서드를 호출하지만 코드가 중단됩니다.왜 내 코드가 멈 춥니 까?

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

비동기 블록에서 동일한 호출을하면 올바르게 실행됩니다. SDK에 방법이 같은 'someObject라는'에 동기화 다른 방법으로, 다른 스레드에서 호출 할 경우 교수형

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

이유 중 하나이지만, 그 사건 아니에요.

그 외 무엇이이 이상한 현상을 일으킬 수 있습니까? 호출 된 메서드가 동기화 된 블록에서 호출되었다는 사실에 영향을받는 이유는 무엇입니까? 중요하다면 이것은 Java-ME에서 실행 중입니다.

+0

여기서 말하는 정보가 충분하지 않다는 정보를 자세히 알려주십시오. 교착 상태 또는 기타 문제 일 수 있습니다. –

+4

정확하게 달린 부분을 보았습니까? 동기화 된 블록에 들어가는 것이 긍정적입니까? 컴파일 가능한 코드를 제공하지 않으면 커뮤니티가 이러한 모든 것에 대해 궁금해하게 만듭니다. –

+0

메서드를 호출하는 동일한 개체에서 동기화해야합니까? 어떤 SDK 방법입니까? 다른 코드가 객체를 사용하는 이유는 무엇입니까? –

답변

3

"교착 상태"라는 조건을 만들었 기 때문에 중단됩니다. 문제는 동기화 된 메서드는 한 번에 하나의 스레드에서만 액세스 할 수 있다는 것입니다. 따라서 사용자의 메서드는이 동기화 메서드에 액세스하고 다른 스레드를 호출하여 잠긴 같은 메서드에 액세스합니다. 따라서 두 번째 스레드는 다른 스레드가 함수를 릴리스 할 때까지 기다리고 있으며 결코 발생하지 않습니다.

+1

과 똑같은 문제를 일으킬 수 있습니다. 단지 다른 이유로 매달려 돌아 오지 않고 –

+0

당신은 남자가 분명히 알고있는 것을 설명하고 있습니다. –

+1

교착 상태의 개념에 대한 자세한 내용은 식당 철학자 문제를 살펴보십시오. –

0

중단 될 때 스레드 덤프를 가져옵니다. 이것은 JVM의 각 스레드에서 잠금 경합을 가리키는 것을 포함하여 무슨 일이 일어나는지 확실히 알려줄 것입니다.

관련 문제