У меня есть класс с двумя синхронизированными функциями. Это означает, что если thread-0 выполнит proc1() и thread-1 захочет сделать то же самое с proc1(), он будет ждать thread-0 чтобы закончить с proc1(). Пожалуйста, поправьте меня, если я ошибаюсь.

Но что, если thread-0 выполняет proc1(), а thread-1 хочет выполнить proc2()? Следует ли thread-1 подождать, когда proc1() закончит к thread-0?

Другими словами - синхронизированные функции синхронизируются на уровне объекта класса или только на уровне функции?

public class MyClass
{
public synchronized void proc1()
{
...
}
public synchronized void proc2()
{
...
}

}
2
vico 19 Фев 2016 в 17:04

2 ответа

Лучший ответ

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

В случае синхронизированного блока объект синхронизации предоставляется явно. В этом примере это любой объект, на который ссылается переменная foo:

synchronized(foo) {
    ...
}

В случае метода синхронизированного экземпляра объектом синхронизации является this (т. Е. Объект, для которого был вызван метод). В этом случае экземпляр MyClass:

class MyClass
    synchronized void proc1() {
        ...
    }
}

И, если это синхронизированный метод static, объектом синхронизации является объект класса. В этом случае это будет MyClass.class:

class MyClass {
    static synchronized void proc2() {
        ...
    }
}
3
Solomon Slow 19 Фев 2016 в 14:24

synchronized применяется на уровне объекта (экземпляра), и поток, обращающийся к методу synchronized, блокирует объект. Таким образом, если вы имеете дело с одним и тем же экземпляром объекта, то thread-0 должен будет снять блокировку, прежде чем thread-1 сможет получить доступ к любым его методам. thread-1 будет находиться в заблокированном состоянии до тех пор, пока не получит блокировку.

Далее это объясняется здесь: Выполняются ли два синхронизированных метода одновременно

0
Community 23 Май 2017 в 11:59