2012-04-19 4 views
2

Мне очень интересно об этом. У меня есть код в синхронизированном блоке
, который вызывает метод SDK, но он зависает.Почему мой код висит?

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

Если я делаю тот же вызов из несинхронизированного блока, он выполняется правильно.

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

Одна из причин, чтобы повесить, если метод делает SDK вызов, в другом потоке, другой метод, который синхронизируется на том же «SomeObject», но это не так.

Что еще может вызвать это странное явление? почему на вызванный метод влияет тот факт, что он был вызван из синхронизированного блока? Если это имеет значение, это работает на Java-ME.

+0

, пожалуйста, подробно расскажите, какой метод вы вызываете, здесь недостаточно информации, это может быть тупик или какая-то другая проблема. –

+4

Вы видели, где именно он висит? Вы уверены, что он даже входит в синхронизированный блок? Вы заставляете сообщество задаваться вопросом обо всех этих вещах, когда вы не предоставляете компилируемый код. –

+0

Вы уверены, что вам нужна синхронизация на том же объекте, на который вы вызываете метод? какой SDK-метод? какой другой код использует объект? –

ответ

3

Это зависает, потому что вы создали условие, называемое «тупиком». Проблема в том, что синхронизированный метод может быть доступен только по одному потоку в то время. Таким образом, ваш метод обращается к этому методу синхронизации и вызывает другой поток для доступа к тому же методу, который заблокирован. Итак, второй поток ждет, когда функция будет выпущена другим потоком, и это никогда не произойдет.

+1

, это может быть мертвый замок, или это может быть процесс просто висит по другой причине и никогда не возвращается –

+0

Вы объясняете вещи, о которых, очевидно, знает парень. –

+1

Посмотрите на проблему философов столовой для более подробной информации о концепции тупика. –

0

Получите дамп потока, когда он висит. Это должно сказать вам точно, что происходит в каждом потоке вашей JVM, включая указание на любой конфликт.

Смежные вопросы