为了账号安全,请及时绑定邮箱和手机立即绑定

如果您对一个对象进行了锁定,那么您是否对它的所有方法都进行了锁定?

如果您对一个对象进行了锁定,那么您是否对它的所有方法都进行了锁定?

www说 2022-06-15 09:48:55
假设我们有一个对象 foo:class Foo(){  public synchronized void instanceMethod(){}}var foo = new Foo();如果我锁定了 foo:synchronized(foo){  foo.instanceMethod();}我也有instanceMethod()通话锁定吗?另一种提问方式 - 如果我锁定了 foo,另一个线程可以调用 foo.instanceMethod()(同时)吗?
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超8个赞

如果我锁定了 foo,另一个线程可以调用 foo.instanceMethod() 吗?


他们可以调用它,但调用将等到执行将您的块synchronized打开foo,因为instanceMethodis synchronized。声明一个实例方法与将其整个主体放在一个块中synchronized大致相同。synchronizedthis


如果instanceMethod 没有同步,那么呼叫当然不会等待。


但是请注意,synchronized您显示的块是不必要的:


synchronized(foo){       // <==== Unnecessary

  foo.instanceMethod();

}

因为instanceMethodis synchronized,那只能是:


foo.instanceMethod();

...除非块中还有其他东西。


查看完整回答
反对 回复 2022-06-15
?
九州编程

TA贡献1785条经验 获得超4个赞

class Foo {

    public synchronized void a() { //Do something }

    public void b() {

        synchronized(this) { // Do something }

    }

    public void c() { // Do something }

}

然后:


Foo foo = new Foo();

foo.a();

foo.b();

synchronized(foo) { foo.c(); }

就同步而言,所有 3 种方法都非常等效。


没有所谓的“锁定”方法。锁定仅对对象进行。标记方法synchronized只是使其锁定实例(或其静态方法的类对象)。


当您访问锁定对象上的方法时,执行将被阻止,因为线程无法检索指定对象的监视器- 甚至在调用该方法之前。所以foo.a()在获取foo.


加上...

我突然想起一件事。如果您有线程 A 调用foo.a()并且它需要很长时间才能完成,并且当时另一个线程调用foo.c(),那么foo.c()仍然会被阻塞直到foo.a()完成。


查看完整回答
反对 回复 2022-06-15
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号