我面临有关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的客户端充当“协调器”.