2014-02-19 6 views
1

Is synchronized ключевое слово в методах предотвращает одновременное выполнение одновременного вызова несколькими потоками в одном экземпляре?Вызов/запуск синхронных методов одновременно

У нас есть один объект и некоторые synchronized методы и разные темы.

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

Спасибо.

+0

Если подключенный объект/тело введен потоком, он заблокирован для других потоков. Когда первый поток заканчивается, он разблокируется и один из других может войти. –

ответ

3

У нас есть один объект и некоторые синхронизированные методы и разные потоки .

Синхронизация по методам будет использовать текущий экземпляр (это) как блокировку, поэтому, если есть только объект, несколько потоков не могут одновременно запускать эти методы.

Синхронизированное ключевое слово в методах предотвращает запуск одновременно или , вызывающий одновременно несколько потоков в одном экземпляре?

Предотвращает запуск одновременно несколькими потоками.

Но как разные потоки могут работать синхронными методами одновременно?

Нет, они не могут работать одновременно.

+0

Итак, есть ли другая возможность одновременного запуска синхронизированных методов? – Sunrise

+0

@Sunrise: Нет, они не могут работать одновременно. –

+0

Так что, если у нас есть несколько объектов класса? – Sunrise

1

Если у вас есть класс, который выглядит так,

class C { 
    public synchronized void method1() { ... } 
    public synchronized void method2() { ... } 
} 

Вы не может иметь любые две нити, работающие method1 или method2, или любую комбинацию из двух одновременно.

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

Если есть методы, которые вы хотели бы запускать одновременно, вам, вероятно, потребуется изучить управление несколькими блокировками (синхронизированные блоки, а не методы, используя какой-либо монитор, отличный от this).

Может быть, вам следует использовать this lesson.

Во-первых, невозможно, чтобы два вызова синхронизированных методов на одном объекте чередовали. Когда один поток выполняет синхронизированный метод для объекта, все другие потоки, которые вызывают синхронизированные методы для одного и того же блока объектов (приостанавливают выполнение) до тех пор, пока первый поток не будет выполнен с объектом.

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