Java 来自不同类的同步语句
我有两个类B和C来实现接口A。在这两个类中都存在一个方法,其中一个语句需要同步。我有这个:Java 来自不同类的同步语句,java,synchronization,Java,Synchronization,我有两个类B和C来实现接口A。在这两个类中都存在一个方法,其中一个语句需要同步。我有这个: class B implements A { @Override public void method(){ //some code here synchronized (this.getClass()) { //some code here }
class B implements A {
@Override
public void method(){
//some code here
synchronized (this.getClass()) {
//some code here
}
}
}
class C implements A {
@Override
public void method(){
//some code here
synchronized (this.getClass()) {
//some code here
}
}
}
我需要同步这两个类中的语句,但是使用this.getClass返回不同的类,它可以同时执行。我如何从不同的类同步这两条语句,使它在同一时间只执行一次 在另一个对象上同步,
method()
的两个实现都可以访问该对象
class D {
public static final Object SYNC_OBJ = new Object();
}
class B implements A {
@Override
public void method(){
//some code here
synchronized (D.SYNC_OBJ) {
//some code here
}
}
}
class C implements A {
@Override
public void method(){
//some code here
synchronized (D.SYNC_OBJ) {
//some code here
}
}
}
需要同步它们的最可能原因是,它们将访问一些公共对象。如果是,请在该对象上同步 如果不是,并且控制接口A,则可以添加:
public static final Object LOCK = new Object();
并让它们在.LOCK上同步。java中的Synchronized块在某些对象上是同步的。在同一对象引用上同步的同步块一次只允许1个线程。其他的将被阻止,直到它离开。因此,对这两种方法使用相同的对象引用。
您可以在
a
中声明共享监视器对象,例如:
静态最终对象监视器=新对象()代码>
然后在B
和C
中使用synchronized(MONITOR)
,您可以轻松地修改代码,而无需引入新的类/变量来执行您想要的操作(假设您要同步a的所有实现):
然而,这不是一个好的解决方案。正确的方法是使用锁。两个实例都需要对同一对象的引用才能锁定。谢谢!我也这样做了,但是在类A中,所以避免创建另一个类。
synchronized (A.class) {
// do something
}