Вызов метода из синхронизированного метода - PullRequest
0 голосов
/ 05 августа 2011

Я столкнулся со странной проблемой, которая заставила меня задуматься, что именно происходит в синхронизированном методе. Допустим, есть метод

synchronized public void example(){
     //...code
     int i=call(); //calling another method
     //...do something with i 
}

Теперь, пока выполняется метод call (), может ли другой объект войти в этот синхронизированный метод example ()? Итак, когда call () возвращается, может быть некоторое исключение ConcurrentModificationException? Что делать, чтобы избежать проблем?

Ответы [ 3 ]

3 голосов
/ 06 августа 2011

Обратите внимание, что в этом примере, если call() не является частным или вызывается откуда-то еще в классе, кто-то другой может прервать то, что вы считаете полностью синхронным процессом.

synchronized void a(){
    println 'hello'
    b();
    println 'world'
}

void b(){

}

Если вы ожидаете, что «все, что делает a, будет охраняться синхронизированным», то, если b имеет какие-либо побочные эффекты, эта гарантия теряется, если методы, отличные от synchronized void a, вызывают b.

3 голосов
/ 05 августа 2011

Нет, не может. Синхронизированный метод в основном такой же, как:

public void example(){
  synchronized(this){
    //do stuff
  }
}
0 голосов
/ 05 августа 2011

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

Вот хорошая статья о блокировках и синхронизации: http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html

...