2014-01-28 3 views
5

Пусть этот кодрасширенные классы синхронизированные методы блокировки

class A 
{ 
    public synchronized void methodA() 
    { 
     // ... 
    } 
} 

class B extends A 
{ 
    @Override 
    public synchronized void methodA() 
    { 
     // ... 
     super.methodA(); 
    } 
} 

Какой замок должен быть приобретен любым потоком, если он хочет получить доступ к функции Methoda класса B и Methoda супер класса А по super.methodA()?

ответ

2

Метод synchronized эквивалентен методу с его телом, обернутым в блок synchronized(this). Таким образом, это:

public synchronized void methodA() 
{ 
    // ... 
} 

так же, как:

public void methodA() 
{ 
    synchronized(this) { 
     // ... 
    } 
} 

Теперь вы можете легко увидеть, что оба methodA реализации блокировки на тот же объект, а именно this объект. То есть, если поток находится в методе суперкласса, он также предотвращает ввод других нитей в любой метод подкласса (и наоборот).

С synchronized замки являются повторителями, успешно входящие B.methodA означает, что вы также можете сразу же ввести super.methodA (так как у вас уже есть замок).

3

Когда вы позвоните B b = new B(); b.methodA();, текущая резьба будет блокироваться на b, введите B.methodA и позвоните по телефону A.methodA. Оба метода используют один и тот же объект, и при вводе A.methodA поток будет просто повторно вводить тот же самый замок, который он уже имеет.

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