synchronized в synchronized методе
От: Cadet  
Дата: 23.01.11 14:15
Оценка:
Доброго времени суток, коллеги.

Осваиваю андроид, ну и параллельно с этим сам язык java — он для меня в новинку. Копаясь в примерах, несколько раз натыкался на конструкцию:
public synchronized void restoreState(Bundle savedState) {
    synchronized (mSurfaceHolder) {
    // ...
    }
}

mSurfaceHolder — приватная экземплярная (нестатическая) переменная.

Какой смысл во внутреннем блоке synchronized? Если я верно понял документацию по java, то все вызовы synchronized методов защищены от одновременного вхождения для каждого объекта, т.е. следующие 2 метода по в моем понимании эквивалентны
public synchronized void method1() {
}

public void method2() {
    synchronized (this) {
    }
}

и в этом случае дополнительный блок не нужен. Я прав или просто еще чего-то не знаю?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re: synchronized в synchronized методе
От: Fuud  
Дата: 23.01.11 17:40
Оценка: 2 (1)
Здравствуйте, Cadet, Вы писали:

C>Доброго времени суток, коллеги.


C>Осваиваю андроид, ну и параллельно с этим сам язык java — он для меня в новинку. Копаясь в примерах, несколько раз натыкался на конструкцию:

C>
C>public synchronized void restoreState(Bundle savedState) {
C>    synchronized (mSurfaceHolder) {
C>    // ...
C>    }
C>}
C>

C>mSurfaceHolder — приватная экземплярная (нестатическая) переменная.

Таким образом можно делать группы синхронизаций. Как-нибудь так:

public synchronized void method1(***) {
    synchronized (mSurfaceHolder) {
    }
}

public synchronized void method2(***) {
}

public void method3(***) {
    synchronized (mSurfaceHolder) {
    }
}


method1 не может выполняться одновременно с двумя другими, а второй и третий одновременно могут.

C>Какой смысл во внутреннем блоке synchronized? Если я верно понял документацию по java, то все вызовы synchronized методов защищены от одновременного вхождения для каждого объекта, т.е. следующие 2 метода по в моем понимании эквивалентны

C>
C>public synchronized void method1() {
C>}

C>public void method2() {
C>    synchronized (this) {
C>    }
C>}
C>

C>и в этом случае дополнительный блок не нужен. Я прав или просто еще чего-то не знаю?

Два метода идентичны.
Re: synchronized в synchronized методе
От: mazurkin http://mazurkin.info
Дата: 23.01.11 18:53
Оценка: +1
On 23.01.2011 17:15, Cadet wrote:

>
 public synchronized void restoreState(Bundle savedState) {
> synchronized (mSurfaceHolder) { // ... } }
mSurfaceHolder -

> приватная экземплярная (нестатическая) переменная.

> Какой смысл во внутреннем блоке synchronized? Если я верно понял

> документацию по java, то все вызовы synchronized методов защищены от
> одновременного вхождения для каждого объекта, т.е. следующие 2 метода
> по в моем понимании эквивалентны

По объекту mSurfaceHolder теоретически может синхронизироваться еще куча
других объектов и не только этого класса
Posted via RSDN NNTP Server 2.1 beta
Re[2]: synchronized в synchronized методе
От: Аноним  
Дата: 24.01.11 08:46
Оценка:
Здравствуйте, mazurkin, Вы писали:

M>По объекту mSurfaceHolder теоретически может синхронизироваться еще куча

M>других объектов и не только этого класса

Указано, что mSurfaceHolder приватная и не статическая для данного класса.
Re[3]: synchronized в synchronized методе
От: dotidot Россия  
Дата: 24.01.11 09:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, mazurkin, Вы писали:


M>>По объекту mSurfaceHolder теоретически может синхронизироваться еще куча

M>>других объектов и не только этого класса

А>Указано, что mSurfaceHolder приватная и не статическая для данного класса.

ну так блоки синхронизации находятся в методах класса, не обязательно само поле наружу выдавать
Re[3]: synchronized в synchronized методе
От: xBlackCat Россия  
Дата: 24.01.11 14:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, mazurkin, Вы писали:


M>>По объекту mSurfaceHolder теоретически может синхронизироваться еще куча

M>>других объектов и не только этого класса

А>Указано, что mSurfaceHolder приватная и не статическая для данного класса.


а this — это тоже не статическая переменная.
Rojac &mdash; Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.