我遇到了有关Java方法同步的问题。我希望我能简单解释一下:
我在两个不同的包中有两种不同的方法。类似的东西:
Package1
|_Class1
\MethodA
Package2
|_Class2
\MethodB
好的,现在我需要同步这两个方法, not threads 。到目前为止,我有两种不同的方法:
共享信号量 。
在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的共享信号量会使事情变得更容易,但是,我知道必须有一个解决方案。提前谢谢。
答案 0 :(得分:4)
您的两种方法都应该有效,但我不认为锁定课程是推荐的做法。首选锁定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
的客户充当“协调者”。