我不确定我的方法是否正确,所以我会尽力描述问题。
我正在编写连接到服务器的客户端。它经常发出一些(不同的)请求。有些可能会发生请求太多,所以我不得不重新登录。 登录由请求标头中设置的令牌验证。
我想实现类似锁定/等待对象的东西。大多数请求在单独的线程中运行,但通过相同的函数发送(最终)请求。在这个函数中,我检查响应的有效性,如果服务器决定踢我,我发送重新登录请求。
我的问题:如果响应无效,我会异步重新登录(响应的JavaFX回调)并继续。 由于多线程任务,可能存在这样的情况:2个(或更多)请求获得相同的无效响应并尝试重新登录,或者一个任务尝试执行请求而另一个请求正在登录(因此没有有效的令牌),收到无效响应,开始登录而另一个收到有效登录,一个在新登录期间失效,依此类推。
如何强制我的任务等到另一个请求的登录完成后?最好的方法是什么?
谢谢并抱歉语法!
答案 0 :(得分:1)
这似乎是访问共享资源的一种情况。你对锁定/等待的直觉是正确的。同步方法似乎是一个很好的解决方案。如果不是,请使用Semaphore。
答案 1 :(得分:0)
假设您有一个负责登录的中央班级,您可以使用可重入锁来管理:
private final ReentrantReadWriteLock loginLock = new ReentrantReadWriteLock();
public boolean isLoggedIn() {
loginLock.readLock().lock();
try {
return loggedIn;
}
finally {
loginLock.readLock().unlock();
}
}
public void login () {
loginLock.writeLock().lock();
try {
if (!isLoggedIn()) {
performLogin();
}
}
finally {
loginLock.writeLock().unlock();
}
}