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

假设我们有一个对象 foo:


class Foo(){

  public synchronized void instanceMethod(){}

}


var foo = new Foo();

如果我锁定了 foo:


synchronized(foo){

  foo.instanceMethod();

}

我也有instanceMethod()通话锁定吗?另一种提问方式 - 如果我锁定了 foo,另一个线程可以调用 foo.instanceMethod()(同时)吗?


www说
浏览 124回答 2
2回答

qq_遁去的一_1

如果我锁定了 foo,另一个线程可以调用 foo.instanceMethod() 吗?他们可以调用它,但调用将等到执行将您的块synchronized打开foo,因为instanceMethodis synchronized。声明一个实例方法与将其整个主体放在一个块中synchronized大致相同。synchronizedthis如果instanceMethod 没有同步,那么呼叫当然不会等待。但是请注意,synchronized您显示的块是不必要的:synchronized(foo){&nbsp; &nbsp; &nbsp; &nbsp;// <==== Unnecessary&nbsp; foo.instanceMethod();}因为instanceMethodis synchronized,那只能是:foo.instanceMethod();...除非块中还有其他东西。

九州编程

class Foo {&nbsp; &nbsp; public synchronized void a() { //Do something }&nbsp; &nbsp; public void b() {&nbsp; &nbsp; &nbsp; &nbsp; synchronized(this) { // Do something }&nbsp; &nbsp; }&nbsp; &nbsp; 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()完成。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java