如果你有一个对象的锁,你对所有的方法锁?

问题描述 投票:3回答:2

假设我们有一个对象foo:

class Foo(){
  public synchronized void instanceMethod(){}
}

var foo = new Foo();

如果我有富锁:

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

我也对锁instanceMethod()打电话?问这个问题的另一种方式 - 如果我有富锁,可以在另一个线程中调用foo.instanceMethod()(同时)?

java synchronized
2个回答
2
投票

如果我有富锁,可以在另一个线程中调用foo.instanceMethod()?

他们可以打电话,但通话将等到执行叶synchronized您块foo,因为instanceMethodsynchronized。声明一个实例方法synchronized是大致相同把其整个身体中的块synchronizedthis

如果instanceMethod不同步,那当然,呼叫不能等待。

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

synchronized(foo){       // <==== Unnecessary
  foo.instanceMethod();
}

由于instanceMethodsynchronized,可以仅仅是:

foo.instanceMethod();

......除非有别的东西在块为好。


1
投票
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被阻止。

Adding on...

我突然想起了什么。如果你有一个线程调用foo.a(),它走的是一条很长的时间才能完成,而当时另一个线程调用foo.c(),然后foo.c()仍将被封锁foo.a()直到完成。

© www.soinside.com 2019 - 2024. All rights reserved.