Public Java 线程安全的最终互斥锁
Public final mutex for Java thread safety
在我的项目中,我必须使用一个class X
,它提供了很多方法,但是文档没有提到这些方法是否是线程安全的,我没有源代码。
所以我用互斥锁将 X
封装在另一个 class 中:
public class MyX {
private X instance;
public final Object mutex = new Object();
public MyX () {
this.instance = new X();
}
public X getMethods () {
return this.instance;
}
}
当我需要调用X
的方法时,我使用了一个synchronized
块:
MyX myX = new MyX();
synchronized (myX.mutex) {
X methods = myX.getMethods();
methods.method1();
methods.method2();
... ... ...
}
或者,也许我可以直接在 class X
:
的实例上同步
X instance = new X();
synchronized(instance) {
instance.method1();
instance.method2();
... ... ...
}
我想知道走哪条路更好,有没有更好的设计来解决这个问题。
谢谢。
如果你想在相同 class 的两个方法之间进行同步,那么你应该选择互斥锁。
将互斥量作为 public 变量公开是违反面向对象原则的,因此当然不推荐。
我认为,在 class 之外工作时,锁定您正在处理的对象是最好的选择。
X instance = new X();
synchronized(instance) {
instance.method1();
instance.method2();
... ... ...
}
在我的项目中,我必须使用一个class X
,它提供了很多方法,但是文档没有提到这些方法是否是线程安全的,我没有源代码。
所以我用互斥锁将 X
封装在另一个 class 中:
public class MyX {
private X instance;
public final Object mutex = new Object();
public MyX () {
this.instance = new X();
}
public X getMethods () {
return this.instance;
}
}
当我需要调用X
的方法时,我使用了一个synchronized
块:
MyX myX = new MyX();
synchronized (myX.mutex) {
X methods = myX.getMethods();
methods.method1();
methods.method2();
... ... ...
}
或者,也许我可以直接在 class X
:
X instance = new X();
synchronized(instance) {
instance.method1();
instance.method2();
... ... ...
}
我想知道走哪条路更好,有没有更好的设计来解决这个问题。
谢谢。
如果你想在相同 class 的两个方法之间进行同步,那么你应该选择互斥锁。
将互斥量作为 public 变量公开是违反面向对象原则的,因此当然不推荐。
我认为,在 class 之外工作时,锁定您正在处理的对象是最好的选择。
X instance = new X();
synchronized(instance) {
instance.method1();
instance.method2();
... ... ...
}