【问题标题】:Java method call from Synchronized block [duplicate]来自同步块的 Java 方法调用 [重复]
【发布时间】:2015-04-01 18:48:18
【问题描述】:

在 Java 中

假设我有一个类似的代码

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

我的问题是,如果一个线程在 methodA 上工作,另一个在 methodB 上工作,那么我的同步块如何得到保护。??

【问题讨论】:

  • 您的问题不清楚。请详细说明。您是在问“如果线程 2 调用 B 而线程 1 调用 A(A 调用 B)会发生什么”?
  • 它没有受到保护。

标签: java multithreading concurrency


【解决方案1】:

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

所以在你的情况下

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

直到1个线程从methodA()中退出,没有其他线程可以进入它,所以它是受保护的。

为了保护这两种方法,你必须像这样使用

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      您还需要在方法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();
      }
      

      【讨论】:

      • 你是说一个线程不能进入a.B(),而其他线程正在调用原始示例中的a.A()?怎么是真的?直接调用a.B() 的线程不会在任何东西上同步。
      • @james large Doh!你说得对。在我的分析中,我已经假设另一个线程也在方法 B 中同步......更新了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多