Многопоточность и синхронизация с вытеснением потока - PullRequest
3 голосов
/ 12 февраля 2011

Предположим, у меня есть следующий фрагмент кода

public synchronized void method()
{
    if(something == null)
    {
        something = new SomeThing();
    }
    //do something 
}

Теперь предположим, что в многопоточной среде один поток [Поток 1] входит в метод и прерывается сразу после выполнения new Something();, но перед нимсмог назначить его на something.Затем другой поток [Поток 2] также пытается вызвать метод.Что именно происходит сейчас?Что происходит с замком, который приобрел Поток 1?Будут ли откатаны шаги темы 1?

Ответы [ 2 ]

7 голосов
/ 12 февраля 2011

Thread1 не отказался от блокировки, поэтому он все еще владеет ею. Когда Thread2 готовится захватить блокировку, он обнаружит, что ему нужно подождать и войти в состояние BLOCKED. В следующий раз, когда ОС запланирует Thread1, она завершит выполнение и снимет блокировку. Это позволяет снова планировать Thread2.

3 голосов
/ 12 февраля 2011

Поток 2 не сможет войти в метод, пока поток 1 не выйдет из него, потому что он синхронизирован.

В конце концов, планировщик может продолжить работу с потоком 1, поток 1 выполнит новый Something () и выйдет из метода. Затем поток 2 сможет войти в функцию с созданным новым Something ().

Вся идея блокировки заключается в том, что поток 1 не теряет его, пока с ним не покончено. Поток 1 разблокируется при выходе из метода (), затем поток 2 может его получить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...