Есть ли разница между синхронизацией метода или добавлением синхронизированного блока в метод?

Будут ли эти два блока кода вести себя одинаково? Вы можете предположить, что эти методы запуска вызываются из потоков.

public synchronized void run() {
    System.out.println("A thread is running.");
}

Or

static Object syncObject = new Object();

public void run() {
    synchronized(syncObject) {
        System.out.println("A thread is running.");
    }
}

person user1420042    schedule 15.02.2013    source источник
comment
Они блокируют разные объекты, как указывает @ Eng.Fouad. Верно?   -  person Gray    schedule 15.02.2013
comment
Спасибо, я не видел эту статью перед публикацией (извините).   -  person user1420042    schedule 15.02.2013


Ответы (2)


public synchronized void run()
{
    System.out.println("A thread is running.");
}

эквивалентен:

public void run()
{
    synchronized(this) // lock on the the current instance
    {
        System.out.println("A thread is running.");
    }
}

и к вашему сведению:

public static synchronized void run()
{
    System.out.println("A thread is running.");
}

эквивалентен:

public void run()
{
    synchronized(ClassName.class) // lock on the the current class (ClassName.class)
    {
        System.out.println("A thread is running.");
    }
}
person Eng.Fouad    schedule 15.02.2013
comment
Одно небольшое замечание по этому поводу. Я считаю, что использование синхронизированного метода немного более полезно / оборонительно. Это немного снижает вероятность того, что кто-то неопытный добавит в метод какой-то код за пределами синхронизированного блока. - person Victor Ronin; 15.02.2013
comment
@VictorRonin +1 Согласен. - person Eng.Fouad; 15.02.2013

Нет, как вы выразились, никакой разницы, но если бы метод был статическим, синхронизированный блок имел бы объект класса включающего класса в качестве блокировки.

person comanitza    schedule 15.02.2013