用于Java线程安全的公共最终互斥体
在我的项目中,我必须使用一个类用于Java线程安全的公共最终互斥体,java,multithreading,synchronization,synchronized,thread-synchronization,Java,Multithreading,Synchronization,Synchronized,Thread Synchronization,在我的项目中,我必须使用一个类X,它提供了很多方法,但是文档没有提到这些方法是否是线程安全的,我也没有源代码 因此,我将X封装在另一个具有互斥锁的类中: public class MyX { private X instance; public final Object mutex = new Object(); public MyX () { this.instance = new X(); } public X getMethods (
X
,它提供了很多方法,但是文档没有提到这些方法是否是线程安全的,我也没有源代码
因此,我将X
封装在另一个具有互斥锁的类中:
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();
... ... ...
}
或者,我可以直接在类X
的实例上进行同步:
X instance = new X();
synchronized(instance) {
instance.method1();
instance.method2();
... ... ...
}
我想知道哪条路比较好,有没有更好的设计来解决这个问题
谢谢。如果您想在同一类的两个方法之间进行同步,那么应该选择互斥 将互斥量作为公共变量公开是违反面向对象原则的,因此当然不建议这样做 在从类外工作时,我会说,获取正在处理的对象的锁是最好的选择
X instance = new X();
synchronized(instance) {
instance.method1();
instance.method2();
... ... ...
}
如果您想在同一类的两个方法之间进行同步,那么应该选择互斥 将互斥量作为公共变量公开是违反面向对象原则的,因此当然不建议这样做 在从类外工作时,我会说,获取正在处理的对象的锁是最好的选择
X instance = new X();
synchronized(instance) {
instance.method1();
instance.method2();
... ... ...
}
非常感谢您@Anand Vaidya。在我的程序中,几个线程将共享类
X
的同一实例。那么我将选择第二种方法。还有一个问题,是synchronized(instance)
相当于publicsynchronizedvoidmethod1()
?是的。当一个线程为一个对象执行同步方法时,调用同一对象块的同步方法的所有其他线程(暂停执行),直到第一个线程对该对象执行完毕。再次感谢你,非常感谢。在我的程序中,几个线程将共享类X
的同一实例。那么我将选择第二种方法。还有一个问题,是synchronized(instance)
相当于publicsynchronizedvoidmethod1()
?是的。当一个线程为一个对象执行同步方法时,调用同一对象块的同步方法的所有其他线程(暂停执行),直到第一个线程对该对象执行完毕。再次感谢您@Anand Vaidya。