Java 同步不同类(和不同包)中的两个方法
我面临一个关于Java方法同步的问题。希望我能简单地解释一下: 我有两个不同的方法,在两个不同的类中,在两个不同的包中。比如:Java 同步不同类(和不同包)中的两个方法,java,synchronization,Java,Synchronization,我面临一个关于Java方法同步的问题。希望我能简单地解释一下: 我有两个不同的方法,在两个不同的类中,在两个不同的包中。比如: Package1 |_Class1 \MethodA Package2 |_Class2 \MethodB package Package3; public class SemaphoreClass { public static Semaphore; } public voi
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我知道它不是真正相关的,这就是为什么我将它们放在“()”;)中的原因