java - 如何正确同步Java中的方法访问

标签 java multithreading synchronized

我有一个类Library,它是一个第三方库,我无权访问源代码。这个类在我的项目的不同类中使用,例如

public class MyOwnClass1 {
    private Library lib;
    public void doTask () {
        String res = lib.libMethod1();
        ... ... ...
    }
}

但是,事实证明类 Library 不是线程安全,例如,当方法 libMethod1 在不同的线程,会导致奇怪的问题。

因此,我必须实现自己的线程安全机制,第一个是将Library变量封装到另一个类中。

public class SafeLibrary {
    private Library lib;
    private Object mutex = new Object();
    ... ... ...
    public String doTask () {
        synchronized(this.mutex) {
            return this.lib.libMethod1();
        }
    }
    ... ... ...
}

但正如我所说,Library 类用于不同类的不同方法中。如果我必须将所有相关方法放入新的SafeLibrary类中,这将花费大量的代码修改。

这是第二个想法:

public class SafeLibrary {
    private Library lib;
    private Object mutex = new Object();
    public Object getMutex() {
        return this.mutex;
    }
    public Library getLib() {
        return this.lib;
    }
}

然后我在自己的类中同步方法访问:

public class MyOwnClass1 {
    private SafeLibrary lib;
    public void doTask () {
        synchronized(lib.getMutext()) {
            String res = lib.getLib().libMethod1();
            ... ... ...
        }
    }
}

通过使用第二种解决方案,我只需要对相关方法做一些小的修改。但 getMutex() 似乎是一种不正确的方法。

我想知道哪种解决方案是正确的,或者是否有其他更好的解决方案?谢谢。

最佳答案

如果 Library 和您要使用的方法不是最终的,并且您自己创建库对象(而不是从 Library 本身的静态方法获取它),那么您可以创建自己的类:

public class SynchronizedLibrary extends Library {
    public synchronized String libMethod1() {
        super.libMethod1();
    }
}

然后您所要做的就是替换构造函数调用,甚至可以将声明的类型保留为普通的旧库(尽管您可能不希望这样做)。

关于java - 如何正确同步Java中的方法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33590082/

相关文章:

java - MongoDB JSON 数组中的 JSON 对象字段删除

java - 如何用Java实现多线程Web服务器

c# - System.Timer 作为单例

java - 你应该同步运行方法吗?为什么或者为什么不?

java - 如何将值从按钮传递到另一个类

java - 实例化接口(interface)后无需编写任何代码即可使用接口(interface)的方法

java - 电子邮件应用程序中的异常

Java 线程 - 同步代码

java - 同步有什么问题

Java:在另一个同步对象内同步对象