Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Java线程安全的公共最终互斥体_Java_Multithreading_Synchronization_Synchronized_Thread Synchronization - Fatal编程技术网

用于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。