0

私は奇妙な問題に直面しており、同期されたメソッドで正確に何が起こるのか疑問に思っています。方法があるとしましょう

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

call() メソッドが実行されている間に、別のオブジェクトがこの同期された example() メソッドに入ることができますか? call() が戻ると、ConcurrentModificationException が発生する可能性があります。トラブルを避けるために何をすべきか?

4

3 に答える 3

3

この例では、call()がプライベートでない場合、またはクラス内の別の場所から呼び出された場合、他の誰かが完全に同期したプロセスであると思われるプロセスを中断する可能性があることに注意してください。

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

void b(){

}

「aが行うすべてのことを同期によって保護する」ことを期待している場合、bに何らかの副作用がある場合、 。をsynchronized void a呼び出す以外のメソッドを使用すると、その保証は失われますb

于 2011-08-05T20:00:54.910 に答える
3

いいえ、できません。同期されたメソッドは、基本的に次のものと同じです。

public void example(){
  synchronized(this){
    //do stuff
  }
}
于 2011-08-05T19:53:26.907 に答える
0

スレッドが Synchronized メソッドに入ると、ロックが発生します。そのメソッドが戻るまで、ロックは解放されません。これは、への呼び出しの後になりますcall()

ロックと同期に関する優れた記事は次のとおりです。 http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html

于 2011-08-05T19:54:16.330 に答える