Java同步方法问题

Vla*_*mir 3 java synchronization synchronized

我有2个同步方法的类:

class Service {

 public synchronized void calc1();

 public synchronized void calc2();

}
Run Code Online (Sandbox Code Playgroud)

两者都需要相当长的时间来执行 问题是这些方法的执行会相互阻塞.即两种方法可以在不同的线程中并行执行吗?

And*_*yle 10

不,它们不能在同一服务上并行执行 - 两种方法共享同一个监视器(即this),因此如果线程A正在执行calc1,则线程B将无法获取监视器,因此将无法跑calc2.(请注意,线程B可以调用这两种方法在不同情况下Service,虽然,因为它会试图获取不同的,unheld显示器,因为this问题会有所不同.)

最简单的解决方案(假设您希望它们独立运行)将使用显式监视器执行以下操作:

class Service {
   private final Object calc1Lock = new Object();
   private final Object calc2Lock = new Object();

   public void calc1() {
       synchronized(calc1Lock) {
           // ... method body
       }
   }

   public void calc2() {
       synchronized(calc2Lock) {
           // ... method body
       }
   }

}
Run Code Online (Sandbox Code Playgroud)

有问题的"锁"不需要具有除了对象之外的任何特殊能力,因此具有特定的监视器.如果您有更复杂的要求,可能涉及尝试立即锁定和回退,或者查询谁持有锁,您可以使用实际的Lock对象,但对于基本情况,这些简单的Object锁是可以的.

  • 嗯,但是只有方法在同一个对象上执行.否则它们可以同时执行,因为它们不是静态的.可能有多个`Service`对象,问题没有对此做出声明. (2认同)