【问题标题】:Public final mutex for Java thread safety用于 Java 线程安全的公共最终互斥锁
【发布时间】:2016-04-06 09:08:09
【问题描述】:

在我的项目中,我必须使用一个类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();
    ... ... ...
}

我想知道走哪条路更好,有没有更好的设计来解决这个问题。

谢谢。

【问题讨论】:

    标签: java multithreading synchronization synchronized thread-synchronization


    【解决方案1】:

    如果你想在同一个类的两个方法之间同步,那么互斥锁是你应该选择的。

    将互斥锁作为公共变量公开是违反面向对象原则的,因此当然不推荐。

    我会说,在课外工作时,锁定你正在处理的对象是最好的选择。

    X instance = new X();
    synchronized(instance) {
    instance.method1();
    instance.method2();
    ... ... ...
    }
    

    【讨论】:

    • 非常感谢@Anand Vaidya。在我的程序中,多个线程将共享X 类的同一个实例。那我选择第二种方式。
    • 还有一个问题,synchronized(instance) 等同于public synchronized void method1() 吗?
    • 是的。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。 stackoverflow.com/questions/9196723/…
    • 再次感谢@Anand Vaidya。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2016-03-04
    • 2020-04-16
    • 2012-12-25
    相关资源
    最近更新 更多