我面临一个奇怪的问题,让我想知道在同步方法中到底发生了什么。假设有一种方法
synchronized public void example(){
//...code
int i=call(); //calling another method
//...do something with i
}
现在正在执行call()方法时,另一个对象可以进入这个同步的example()方法吗?所以当call()返回时,可能会出现一些ConcurrentModificationException?该怎么做才能避免问题?
答案 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