2010-02-21 3 views
1

Я изучаю внутренности Java в течение некоторого времени. Мне любопытно узнать и понять, как потоки/блокировки происходят на Java.Внутренние темы Java

Итак, для доступа к синхронизированному методу или синхронизированному блоку поток должен сначала получить блокировку объекта. Итак, теперь, вот что мне нужно немного больше света.

Итак, всякий раз, когда поток получает блокировку объекта, увеличивает ли он значение семафора внутри? Если да, тогда давайте посмотрим на этот сценарий.

class ABC{ 

    public void method_1(){ 
     synchronized(xyz){ 
      .... 
     } 
    } 

    public void method_2(){ 
     ... 
     synchronized(xyz){ 
      .... 
     } 
    } 
} 

Так, говорят, что есть две темы: Threaad 1 и 2. Тема Предполагая, Резьба1 Введенные method_1 первый и поэтому приобрел замок на АБВ первым. И, скажем, Thread2 вводит метод_2 и пытается получить блокировку на xyz. Что случится? (Примите во внимание, что Thread2 будет заблокирован, так как он обнаружит, что значение семафора объекта> 0)

Сообщите мне, если мои рассуждения верны.

+0

Да. Что за вопрос? Вы в основном повторяете определение того, как документируется блокировка для работы. –

+0

Да, ваше описание верное на общем уровне. Есть что-то в этом описании, которое не имеет для вас смысла? –

ответ

1

всякий раз, когда поток получает блокировку объекта, увеличивает ли он значение семафора внутри?

Реализация конкретная, но маловероятная. Поскольку каждый замок можно получить только один раз, нет необходимости в счетчике. Простой переключатель. Я предполагаю, что каждая блокировка содержит ссылку на Thread, которая владеет им (или null).

Обновление: На самом деле это довольно сложная задача. Блокировка также должна содержать список потоков, которые ждут его. Кроме того, поток может временно освободить блокировку через механизм ожидания/уведомления (таким образом, после этого будет счетчик ввода). Кроме того, управление блокировками оказывает большое влияние на производительность, поэтому происходит всевозможная оптимизация. Я нашел этот interesting blog тем, кто работает над блокировкой JVM.

Итак, скажем, есть два потока: Threaad 1 и Thread 2. Предполагая, что Thread1 сначала ввел метод_1 и, следовательно, сначала получил блокировку на xyz. И, скажем, Thread2 входит в метод_2 и пытается получить блокировку на xyz. Что случится?

Да, нить 2 будет заблокирована и дождитесь, пока она не сможет получить блокировку.

1

Проверьте, пожалуйста, подробную информацию о вашей организации. Тема 2 будет заблокирована и останется заблокированной до тех пор, пока (по крайней мере) Thread1 не выпустит мьютекс.

Однако замок обычно не используется с использованием обычного семафора с простым счетчиком. Как правило, существует один бит блокировки, который только «накачивается» в полную блокировку, если объект блокируется повторно (например, если Thread1 пытается заблокировать xyz, когда он уже удерживает блокировку на этом объекте) или когда есть конкуренция за блокировку (например, когда Thread2 пытается заблокировать xyz, а Thread1 заблокирован).

Но вам не нужно беспокоиться о деталях реализации Java-замков ... если вы не реализуете JVM самостоятельно!

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