0

我面临一个奇怪的问题,这让我想知道同步方法中到底发生了什么。假设有一个方法

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

现在在执行 call() 方法时,另一个对象可以进入这个同步的 example() 方法吗?那么当 call() 返回时,可能会出现一些 ConcurrentModificationException?怎么做才能避免问题?

4

3 回答 3

3

不,它不能。同步方法与以下基本相同:

public void example(){
  synchronized(this){
    //do stuff
  }
}
于 2011-08-05T19:53:26.907 回答
3

请注意,在此示例中,如果call()不是私有的或从类中的其他位置调用,则其他人可以中断您认为完全同步的过程。

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

void b(){

}

如果您期望“a 所做的一切都由同步保护”,那么如果 b 有任何副作用,那么如果synchronized void a调用以外的方法,则该保证将丢失b

于 2011-08-05T20:00:54.910 回答
0

当线程进入 Synchronized 方法时,会发生锁,直到该方法返回时才会释放锁,这将在您调用call().

这是一篇关于锁和同步的好文章:http: //download.oracle.com/javase/tutorial/essential/concurrency/locksync.html

于 2011-08-05T19:54:16.330 回答