2014-12-04 7 views
0

Как показано в примере ниже, после того, как блокировка выполняется над объектом в методе call, нет необходимости в дополнительных методах для использования ключевого слова.Синхронизация на уровне java-поведения на уровне

public class Prac 
{ 
    public static void main(String[] args) 
    { 
     new Prac().call(); 
    } 

    private synchronized void call() 
    { 
     further(); 
    } 

    private synchronized void further() 
    { 
     oneMore(); 
    } 

    private synchronized void oneMore() 
    { 
     // do something 
    } 
} 

Но, если я все-таки добавить synchronized ключевое слово в further и onceMore, чем Java делает на таких встречах? Проверяет ли java, требуется ли блокировка или нет? или как вызов метода находится в одном стеке, он просто продолжается, не проверяя, требуется ли блокировка или нет, поскольку блокировка уже получена.

Примечание: Мое сомнение в том, как java будет вести себя в такой ситуации, я не уверен, но я думаю, что это отличается от предвзятой блокировки.

ответ

4

Фактически, java проверяет, имеет ли текущий поток блокировку каждый раз, когда он вводит синхронизированный метод.

private synchronized void oneMore() 
    { 
     // do something 
    } 

Это эквивалентно

private void oneMore(){ 
     synchronized(this){ 
     // do something 
    } 
} 

Но из-за того, что внутренние замки в Java реентерабельны; если поток имеет блокировку, он не восстанавливает его, как только он входит в другой синхронизированный блок, как в вашем примере. В противном случае это создаст тупик.

Обновление: Чтобы ответить на ваш комментарий ниже. От Java Concurency на практике:

Reentrancy is implemented by associating with each lock an acquisition count 
and an owning thread. When the count is zero, the lock is considered unheld. 
When a thread acquires a previously unheld lock, the JVM records the owner 
and sets the acquisition count to one. If that same thread acquires the lock 
again, the count is incremented, and when the owning thread exits the 
synchronized block, the count is decremented. When the count reaches zero, 
the lock is released. 

Таким образом, проверка, если замок приобретается, эквивалентно, если заявление (более или менее), что переменная держит владеющее нити равна или не нити, пытаясь приобрести замок.

Однако, как вы указали, нет ключевого слова synchronized для частных методов. В общем, вы должны попытаться удалить ненужную синхронизацию, поскольку это обычно приводит к ухудшению производительности.

+0

проверяет ли блокировка накладные расходы на производительность? – Batty

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