来自不同 类 的同步语句
Synchronized statements from different classes
我有两个实现接口 A 的 类 B 和 C。在这两个 类 中都存在一个带有需要同步的语句的方法。我有这个:
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 return 不同 类 并且它可以同时执行。我怎样才能同步这两个来自不同 类 的语句,使其同时只执行一次?
在 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();
并让它们在 A.LOCK 上同步。
java 中的同步块在某些对象上同步。在同一对象引用上同步的同步块一次只允许 1 个线程。其他将被阻止直到它离开。因此,对这两种方法使用相同的对象引用。
https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
您可以在 A
中声明一个共享监视器对象,例如:
static final Object MONITOR = new Object();
然后在B
和C
中使用synchronized(MONITOR)
。
您无需引入新的 class/variable 即可轻松修改您的代码以完全按照您的意愿进行操作(假设您希望同步 A 的所有实现):
synchronized (A.class) {
// do something
}
但这不是一个好的解决方案。正确的做法是使用锁。
我有两个实现接口 A 的 类 B 和 C。在这两个 类 中都存在一个带有需要同步的语句的方法。我有这个:
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 return 不同 类 并且它可以同时执行。我怎样才能同步这两个来自不同 类 的语句,使其同时只执行一次?
在 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();
并让它们在 A.LOCK 上同步。
java 中的同步块在某些对象上同步。在同一对象引用上同步的同步块一次只允许 1 个线程。其他将被阻止直到它离开。因此,对这两种方法使用相同的对象引用。 https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
您可以在 A
中声明一个共享监视器对象,例如:
static final Object MONITOR = new Object();
然后在B
和C
中使用synchronized(MONITOR)
。
您无需引入新的 class/variable 即可轻松修改您的代码以完全按照您的意愿进行操作(假设您希望同步 A 的所有实现):
synchronized (A.class) {
// do something
}
但这不是一个好的解决方案。正确的做法是使用锁。