【问题标题】:Java synchronized methods questionJava同步方法问题
【发布时间】:2011-09-21 00:34:53
【问题描述】:

我有两个同步方法的课程:

class Service {

 public synchronized void calc1();

 public synchronized void calc2();

}

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

【问题讨论】:

    标签: java synchronization synchronized


    【解决方案1】:

    它们不能在同一个服务上并行执行 - 两种方法共享同一个监视器(即this),因此如果线程 A 正在执行 calc1,则线程 B将无法获得监视器,因此将无法运行calc2。 (请注意,线程 B 可以在 Service 的不同 instance 上调用任一方法,因为它将尝试获取不同的未持有的监视器,因为所讨论的 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
           }
       }
    
    }
    

    所讨论的“锁”不需要具有任何特殊能力,而不是作为对象,因此具有特定的监视器。如果您有更复杂的要求,可能涉及尝试立即锁定和回退,或查询谁持有锁定,您可以使用实际的 Lock 对象,但对于基本情况,这些简单的 @987654328 @锁很好。

    【讨论】:

    • 嗯,但前提是方法在同一个对象上执行。否则它们可以同时执行,因为它们不是静态的。可能有多个Service 对象,问题没有对此作出声明。
    • @musiKk - 非常好,值得明确提出。我已经相应地更新了我的答案。
    【解决方案2】:

    是的,您可以在两个不同的线程中执行它们而不会弄乱您的类内部,但它们不会并行运行 - 只会执行其中一个每次。

    【讨论】:

      【解决方案3】:

      不,他们不可能。在这种情况下,您可能会使用 synchronized 块而不是同步整个方法。不要忘记在不同的对象上进行同步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多