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

我面临有关Java方法同步的问题.希望我可以简要解释一下:

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

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB

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

共享信号量.

在Package1和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的共享信号量会使事情变得更容易,但是,我知道必须为此提供解决方案.提前致谢.

解决方法:

您的两种方法都应该起作用,但是我不认为锁定类是推荐的做法.优先锁定Object实例,或使用java.util中的适当锁定.另外,请勿锁定String.

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

   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的客户端必须传递正确的锁. Class1和Class2的客户端充当“协调器”.

上一篇:Java中的原子性和内存顺序


下一篇:是什么导致使用Collections.synchronizedList的java.util.concurrentmodificationexception?