从同步方法中调用方法

时间:2011-08-05 19:51:32

标签: java multithreading concurrentmodification

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

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

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

3 个答案:

答案 0 :(得分:3)

不,不能。同步方法基本上与:

相同
public void example(){
  synchronized(this){
    //do stuff
  }
}

答案 1 :(得分:3)

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

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

void b(){

}

如果您希望“同步保护的所有内容”,那么如果b有任何副作用,那么如果synchronized void a以外的方法调用b,则该保证会丢失。 / p>

答案 2 :(得分:0)

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

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