首页 文章

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

提问于
浏览
2

我正面临着关于Java方法同步的问题 . 我希望我能简单解释一下:

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

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB

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

Shared semaphore .

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

package Package3;

 public class SemaphoreClass {

    public static Semaphore;

}

无论如何,我真的不知道JVM是否会将此视为共享信号量 .

Synchronized (SharedClass.class) .

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

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

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

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

1 回答

  • 3

    你的两种方法都应该有效,但我不认为锁定课程是一种推荐的做法 . 首选锁定 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 的客户端充当"orchestrator" .

相关问题