2012-04-27 8 views
1

У меня есть путаница относительно нить Синхронизация. Рассмотрим я есть две нити thread1 и thread2 и два метода синхронизированный foo1() и foo2(). foo1() is synchronized метод и foo2() не является, внутри foo1 внутри есть оператор, который вызывает foo2(), и если Thread1 вызывает foo1() и тем, что он работает в методе foo2(), в то же время Thread2 хочет напрямую обратиться к foo2(), который не синхронизирован.Thread Safe Synchronization Block

Так что мой вопрос: будет Thread2 получить доступ к Foo2()? или он будет ждать, пока Thread1 выполнит свою задачу?

+1

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

+0

Да, я следую этой инструкции, спасибо за ваш быстрый ответ. –

ответ

3

Это объект, а не метод, который заблокирован. Это означает, что вы можете иметь два потока в foo1(), если они обращаются к различным объектам. Если они обращаются к одному и тому же объекту, одна и та же блокировка предотвратит параллельный доступ, независимо от того, что называется первым или что его вызывает.

BTW: foo1() может называть себя, поскольку он уже имеет замок.

+2

+1 for Это объект, а не метод, который заблокирован. – amod

+2

Источником путаницы является то, что метод помечен как синхронизированный, но не метод, который заблокирован. ;) –

+2

Чтобы развернуть комментарий Питера Лори, 'public synchronized void foo() {...}' действительно означает 'public void foo() {synchronized (this) {...}}' – Anonymoose

4

Если foo2() не синхронизирован, любой поток может называть его в любое время без блокировки. Не имеет значения, вызывает ли поток его из другого метода, который сам синхронизируется.

1

Thread2 не будет заблокирован и не будет ждать. Он запустит выполнение Foo2, так как он не синхронизирован.

0

Резьба2 можно назвать foo2() непосредственно, потому что foo2() не синхронизирован метод, так что любой поток может вызвать его и не приобретать монитор текущего объекта.