我正在读一本关于OCPJP考试的书。上面写着
可以声明整个方法是同步的。在这种情况下,当调用声明为同步的方法时,将在调用该方法的对象上获得一个锁,并在该方法返回给调用方时释放该锁。
我从这句话中得到了什么;
如果有一个名为A的类,它调用一个同步方法,驻留在类B中,则从类A的对象(该方法被调用)获取锁。
对不对?
它需要从B类对象获取锁吗?就像使用此引用的同步块一样。
发布于 2014-05-22 07:59:34
如果有一个名为A的类,它调用一个同步方法,驻留在类B中,则从类A的对象(该方法被调用)获取锁。
不,在这种情况下,B类的对象将用作锁,因为该方法属于B类
发布于 2014-05-22 08:08:01
锁在A使用的B对象上,这个对象可以在任何地方,在我的示例中它在A类中,但是它可以通过execute()-method的参数传递给A。
想象一下:
public class A{
public B objectB;
public void execute(){
objectB = new B();
// objectB is synchronized during the execution of the following call, no other
// Thread can access ANY synchronized method of objectB or any
// synchonized(this) block within objectB in this time
objectB.syncedMethod();
}
}
public class B{
public synchronized void syncedMethod(){
//doImportantStuff
}
public synchronized void anotherSyncmethod(){
//do other important stuff
}
}其效果与方法内的"this“同步一样(我猜得到的Java字节码将有所不同,请参阅注释)
public class B{
public void syncedMethod(){
synchronized(this){
//doImportantStuff
}
}
public void anotherSyncmethod(){
synchronized(this){
//do other important stuff
}
}
}发布于 2014-05-22 08:15:14

每个对象都有一个与其关联的锁,其所有同步方法都必须在输入该方法之前获取其锁。因此,如果任何线程对图中描述的对象调用m1()或m2(),那么它必须获取包含m1()或m2()的对象的锁,而不是它本身的锁。
https://stackoverflow.com/questions/23800926
复制相似问题