java - 用于 Java 线程安全的公共(public)最终互斥锁

标签 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 () {
        return this.instance;
    }
}

当我需要调用X的方法时,我使用synchronized block :

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();
    ... ... ...
}

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

谢谢。

最佳答案

如果您想在同一类的两个方法之间进行同步,那么您应该选择互斥体。

将互斥体公开为公共(public)变量违反了面向对象的原则,因此当然不推荐。

我认为,在类外工作时,获取正在处理的对象的锁是最好的选择。

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

关于java - 用于 Java 线程安全的公共(public)最终互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36446448/

相关文章:

java - 验证 Base64 编码的字符串

java - 通过按钮和 .txt 文件输入 2D 数组 处理 Java

java - 如果我将变量复制到另一个变量并尝试更改它,是否会使变量 volatile 起作用?

linux系统调用创建进程和线程

c# - 在 C# 中,如何编码对后台线程的调用并在其上下文中执行它?

java - 如何用 Java 求解 ODE?

java - jList 中的部分文本应加粗

swift - 在OperationQueue中打印1到10不打印整数

c# - 使用 async-await 进行数据库查询

android 可以 SQLiteDatabase 的单个实例管理多个线程之间的同步吗?