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

Java 同步不同类(和不同包)中的两个方法,java,synchronization,Java,Synchronization,我面临一个关于Java方法同步的问题。希望我能简单地解释一下: 我有两个不同的方法,在两个不同的类中,在两个不同的包中。比如: Package1 |_Class1 \MethodA Package2 |_Class2 \MethodB package Package3; public class SemaphoreClass { public static Semaphore; } public voi

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

我有两个不同的方法,在两个不同的类中,在两个不同的包中。比如:

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB
 package Package3;

 public class SemaphoreClass {

    public static Semaphore;

}
 public void MethodA() {
        synchronized (SharedClass.class) {
           //...
        }
好的,现在我需要同步这两个方法,它们不是线程。到目前为止,我有两种不同的方法:

共享信号量

Package1
Package2
之外创建一个共享的静态信号量,类似于:

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB
 package Package3;

 public class SemaphoreClass {

    public static Semaphore;

}
 public void MethodA() {
        synchronized (SharedClass.class) {
           //...
        }
<>我真的不知道JVM是否会认为这是一个共享的信号量。无论如何,

已同步(SharedClass.class)

使用共享类同步这两个方法,类似于:

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB
 package Package3;

 public class SemaphoreClass {

    public static Semaphore;

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


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

您的两种方法都应该有效,但我不认为锁定类是推荐的做法。更喜欢锁定
对象的实例
,或者使用
java.util
中的适当锁定。另外,不要锁定
字符串

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

   class Class1 {
        private final Object lock;
        public Class1( Object lock ) { this.lock = lock }
        public method() { synchronize( lock ) { } );
   }
然后确保创建一个锁(使用
newobject()
),并将其传递给
Class1
Class2
的两个实例


因此,基本上,你已经把最初的问题分解为两个:1)这两个类不共享任何静态全局的东西,它们只接收一个参数。2)
Class1
Class2
的客户端必须通过正确的锁。
Class1
Class2
的客户端充当“编排器”

信号量解决方案很好。。。但是,不要忘记在
最后
块中释放它!类在不同的包中这一事实并不相关,您可以像同步单个类的实例一样同步它的实例。@SJuan76我知道它不是真正相关的,这就是为什么我将它们放在“()”;)中的原因