我有一個類Library
這是一個第三方庫,我無法訪問源代碼。這個類在不同的班級我的項目中使用,如如何在Java中正確同步方法訪問
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()
似乎是一種不正確的方式。
我想知道哪種解決方案是正確的,或者是否有其他更好的解決方案?謝謝。