同步不同类(和不同包)中的两个方法

时间:2013-06-19 09:03:59

标签: java synchronization

我遇到了有关Java方法同步的问题。我希望我能简单解释一下:

我在两个不同的包中有两种不同的方法。类似的东西:

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB

好的,现在我需要同步这两个方法, not threads 。到目前为止,我有两种不同的方法:

共享信号量

Package1Package2之外创建共享静态信号量,例如:

 package Package3;

 public class SemaphoreClass {

    public static Semaphore;

}

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

已同步(SharedClass.class)

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

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

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

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

1 个答案:

答案 0 :(得分:4)

您的两种方法都应该有效,但我不认为锁定课程是推荐的做法。首选锁定Object的实例,或使用java.util中的正确锁定。另外,请勿锁定String

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

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

然后确保您创建一个锁定(使用new Object())并将其传递给Class1Class2的两个实例。

所以基本上,你已经将原来的问题分解为两个:1)这两个类没有静态地共享任何东西,它们只是接收一个参数。 2)Class1Class2的客户端必须通过正确的锁定。 Class1Class2的客户充当“协调者”。