2 回答
TA贡献1725条经验 获得超8个赞
如果我锁定了 foo,另一个线程可以调用 foo.instanceMethod() 吗?
他们可以调用它,但调用将等到执行将您的块synchronized打开foo,因为instanceMethodis synchronized。声明一个实例方法与将其整个主体放在一个块中synchronized大致相同。synchronizedthis
如果instanceMethod 没有同步,那么呼叫当然不会等待。
但是请注意,synchronized您显示的块是不必要的:
synchronized(foo){ // <==== Unnecessary
foo.instanceMethod();
}
因为instanceMethodis synchronized,那只能是:
foo.instanceMethod();
...除非块中还有其他东西。
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()完成。
添加回答
举报
