java从同步方法中调用方法
我面临一个奇怪的问题,这让我想知道在同步方法中到底发生了什么。假设有一种方法
synchronized public void example(){
//...code
int i=call(); //calling another method
//...do something with i
}
现在,在执行call()方法时,另一个对象可以进入这个同步的example()方法吗?因此,当call()返回时,可能会出现一些ConcurrentModificationException?如何避免出现问题
# 1 楼答案
不,不能。同步方法基本上与以下方法相同:
# 2 楼答案
请注意,在本例中,如果
call()
不是私有的,或者是从类中的其他地方调用的,则其他人可以中断您认为是完全同步的过程如果您期望“a所做的一切都由synchronized保护”,那么如果b有任何副作用,那么如果除
synchronized void a
之外的方法调用b
,则该保证将丢失# 3 楼答案
当一个线程进入一个同步的方法时,会发生一个锁,该锁直到该方法返回后才会释放,这将是在您调用
call()
之后下面是一篇关于锁和同步的好文章: http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html