3

我面临一个关于 Java 方法同步的问题。让我们希望我能简单地解释一下:

我在两个不同的类中有两种不同的方法,在两个不同的包中。就像是:

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB

好的,所以现在我需要同步这两个方法,它们不是线程。到目前为止,我有两种不同的方法:

共享信号量

Package1在and外部创建一个共享静态信号量Package2,例如:

 package Package3;

 public class SemaphoreClass {

    public static Semaphore;

}

无论如何,我真的不知道 JVM 是否会认为这是一个共享信号量。

同步 (SharedClass.class)

使用共享类来同步这两种方法,例如:

 public void MethodA() {
        synchronized (SharedClass.class) {
           //...
        }

public void MethodB() {
        synchronized (SharedClass.class) {
           //...
        }

无论如何,这些只是方法。我想听听什么是实现我想要实现的目标的最佳方式。为 JVM 提供共享信号量会使事情变得更容易,但是,我知道必须有一个解决方案。提前致谢。

4

1 回答 1

5

您的两种方法都应该有效,但我不认为锁定类是推荐的做法。更喜欢锁定 的实例Object,或使用来自 的适当锁java.util。另外,不要锁定String

或者,您可以让类的实例,Class1Class2可以在实例化期间将锁作为参数:

   class Class1 {
        private final Object lock;
        public Class1( Object lock ) { this.lock = lock }
        public method() { synchronize( lock ) { } );
   }

然后确保创建一个锁(使用new Object())并将其传递给 和 的两个Class1实例Class2

所以基本上,你已经把原来的问题分成了两部分:1)这两个类不共享任何静态全局的东西,它们只是接收一个参数。2) 客户端Class1必须Class2通过正确的锁。客户端Class1Class2充当“协调者”。

于 2013-06-19T09:17:33.063 回答