gpt4 book ai didi

java - 从另一个类访问的单例类

转载 作者:行者123 更新时间:2023-11-29 09:10:07 26 4
gpt4 key购买 nike

我有一个场景,我必须连接到虚拟中心并获取数据。我已经实现了一个单例类,这样两个线程就不能同时访问 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 个请求从虚拟中心获取数据,其中一个会失败并提示“ session 未通过身份验证”。你能帮助我们用更好的方法来处理这个问题吗?由于始终使用相同的实例,我们如何区分它是否是不同的虚拟中心。

最佳答案

你的序列

  1. 连接
  2. 做事
  3. 断开连接

不是原子的,这意味着有可能

  1. 线程 1 连接
  2. 线程 2 连接
  3. 线程 1 做事
  4. 线程 1 断开连接
  5. 线程 2 尝试做某事但失败了。

构建您的类,使客户端不会连接失败、断开连接失败或与另一个客户端交错操作。

您的 API 可以允许想要使用连接的代码传入连接时使用连接的对象,并返回使用该连接的结果:

 public interface ConnectionTask<T> {
public T useConnection(Connection c);
}

然后代替 getInstance 编写一个 useConnection

 public synchronized <T> T useConnection(ConnectTask<T> c) {
connect();
try {
return c.useConnection(this);
} finally {
disconnect();
}
}

并使connectdisconnect private 以便客户端不能滥用它们。

关于java - 从另一个类访问的单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com