我有一個場景,我必須連接到虛擬中心並獲取數據。我實現了一個單例類,以便兩個線程不能同時訪問VC,因爲它提供了併發訪問問題。我的代碼如下:從另一個類訪問的單例類
public class Connector {
private static Connector instance ;
private Connector(String urlStr, String username, String password) {
connect(urlStr, username, password);
}
public static synchronized Connector getInstance(String urlStr, String username, String password) {
if (instance == null){
instance = new Connector(urlStr,username,password);
System.out.println("creating instance");
}
return instance ;
}
public void connect(String urlStr, String username, String password) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
//code to connect to VC
}
} catch (RuntimeException e) {
connectException = e;
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
}
public void disconnect() throws RuntimeFault, RemoteException {
//code for disconnect
}
}
}
我以下列方式稱爲從另一個類:
Connector c = Connector.getInstance(dburl, dbuser, dbpass);
c.connect(dburl, dbuser, dbpass);
//code for getting data
c.disconnect();
現在,如果我有2個同時請求獲得來自viruatal中心的數據,其中一人失敗說「會話未通過身份驗證」。 你能幫助我們以更好的方式來處理這個問題嗎?因爲總是使用相同的實例,我們如何區分不同的虛擬中心。
你做得完全錯誤,不要使用單身,如果你不能 –
換句話說就是@RomanC說的。 –
閱讀:https://sites.google.com/site/steveyegge2/singleton-considered-stupid –