2012-05-19 5 views
0

Мне нужно очистить некоторые моменты относительно синхронизации на уровне блока.синхронизация на уровне блока

предположим следующие блоки синхронизации являются в том же методе класса:

class A{ 

some_method(){ 

//BLOCK1 
synchronized(OBJ1){ 
shared code... 
} 

//BLOCK2 
synchronized(OBJ1){ 
shared code... 
} 

//BLOCK3 
synchronized(OBJ2){ 
shared code... 
} 
} 

} 

следующие запросы:

1) Правильно ли это, что если один поток поступает block1, получив блокировку на obj1, то ни один другой поток не может войти в Block2 до тех пор, пока первый поток удерживает блокировку на OBJ1, но другой поток может одновременно запускать блок3?

2) Нужно ли первой резьбе снова получить блокировку OBJ1, если она входит в блок2 после завершения блока1?

3) если первая нить вызывает некоторый код в блоке2, из блока 1, то он должен будет освободить блокировку на OBJ1 получить во время первого выполнения блока и снова получить его ИЛИ получить то же самое, что и при первом блоке?

Теперь предположим, что block1 находится в методе одного класса и blockk2 и 3 в методе какого-либо другого класса

4) То же, что и в пункте 1 справедливо как синхронизация происходит посредством получения блокировки на некоторых третьего класса obj (OBJ1, OBJ2)?

+0

это домашнее задание? – mata

+2

[Учебники по Java: синхронизированные методы] (http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html) – matthewnreid

ответ

0
  1. Да, это правильно.
  2. Да, поскольку блок синхронизирован по OBJ1
  3. Я не понимаю, что вы имеете в виду. Если то, что вы спрашиваете, это «блокировка реентерабера?», То да. Поток, который уже имеет блокировку объекта, может ввести другой блок, синхронизированный на одном и том же объекте.
  4. Да. Где код не имеет значения. Важно то, что поток имеет блокировку или нет.
0

1) Да, если поток удерживает блокировку obj1 то никакой другой поток не может получить ту же блокировку

2) Да, блокировка должна быть приобретена снова, потому что будет выпущена в конце блока 1

3) нет, поток не будет блокировать на замок, что он уже имеет

4) Да

0

1) ДА
2) Да, так как я t находится вне BLOCK1.

3) Тот же замок удерживает (т. Е. Уже приобретен) для вложенной блокировки как этот.

Теперь предположим, что block1 в методе одного класса и blockk2 и 3 находятся в методе некоторого другого класса
>> Ans: Результаты не будут отличаться, насколько объект блокировки тот же объект в памяти.

4) Да

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