来自Synchronized块的Java方法调用

时间:2015-02-02 18:25:10

标签: java multithreading concurrency

在Java中

假设我有一个像

这样的代码
class A {
    method A(){
        synchronized(this) 
        {
            this.B();
        }
    }
    method B(){
        //do modification stuff here
    }
}

我的问题是,如果一个线程在methodA上运行,而另一个线程在methodB上运行,那么我的synchronized块如何得到保护。??

3 个答案:

答案 0 :(得分:2)

您还需要在方法B中进行同步。

class A {
    method A(){
        synchronized(this) 
        {
            this.B();
        }
    }
    method B(){
        synchronized(this) 
            //do modification stuff here
        }
    }
}

P.S。:由于您在方法的整个主体周围进行同步,因此可以在方法声明中使用synchronized关键字:

public synchronized void methodA() {
    this.B();
}

答案 1 :(得分:2)

Java中的 synchronized块在某个对象上同步。在同一对象上同步的所有同步块只能同时在其中执行一个线程。尝试进入同步块的所有其他线程都被阻塞,直到同步块内的线程退出块。

所以在你的案例中

 method A(){
        synchronized(this) 
        {
            this.B();
        }
    }

直到1个线程退出方法A()没有其他线程可以输入它,所以它受到保护。

对于保护两种方法,您必须像这样使用

class A {
    method A(){
        synchronized(this) 
        {
            this.B();
        }
    }
    method B(){
        synchronized(this) 
            //do modification stuff here
        }
    }
}

答案 2 :(得分:1)

如果我正确理解您的问题,您希望同步对这两种方法的访问:

class A{
  synchronized void A() {
     B();
  }
  synchronized void B() {
  }
}

这样,A()B()将使用相同的互斥锁进行门控,如果一个线程尝试运行B()而另一个线程已经运行A(),则将不得不等待。

在您给出的示例中,如果B()是私有方法,并且您的所有线程都通过其A()方法访问该对象,则不会出现问题,因为运行的线程{通过在B()中输入synchronized{}块,{1}}已经获得了锁定。