首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java同步方法- OCPJP

Java同步方法- OCPJP
EN

Stack Overflow用户
提问于 2014-05-22 07:56:27
回答 3查看 161关注 0票数 0

我正在读一本关于OCPJP考试的书。上面写着

可以声明整个方法是同步的。在这种情况下,当调用声明为同步的方法时,将在调用该方法的对象上获得一个锁,并在该方法返回给调用方时释放该锁。

我从这句话中得到了什么;

如果有一个名为A的类,它调用一个同步方法,驻留在类B中,则从类A的对象(该方法被调用)获取锁。

对不对?

它需要从B类对象获取锁吗?就像使用此引用的同步块一样。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-22 07:59:34

如果有一个名为A的类,它调用一个同步方法,驻留在类B中,则从类A的对象(该方法被调用)获取锁。

不,在这种情况下,B类的对象将用作锁,因为该方法属于B类

票数 2
EN

Stack Overflow用户

发布于 2014-05-22 08:08:01

锁在A使用的B对象上,这个对象可以在任何地方,在我的示例中它在A类中,但是它可以通过execute()-method的参数传递给A。

想象一下:

代码语言:javascript
复制
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字节码将有所不同,请参阅注释)

代码语言:javascript
复制
public class B{
    public void syncedMethod(){
      synchronized(this){
        //doImportantStuff
      }
    }

    public void anotherSyncmethod(){
        synchronized(this){
         //do other important stuff
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-05-22 08:15:14

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23800926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档