2

我不确定我的方法是否正确,所以我会尽力描述问题。

我正在编写一个连接到服务器的客户端。它经常发出一些(不同的)请求。有时可能会发生请求太多,所以我不得不重新登录。登录由请求标头中设置的令牌验证。

我想实现类似锁/等待对象的东西。大多数请求在单独的线程中运行,但通过相同的函数发送(最终)请求。在这个函数中,我检查响应的有效性,如果服务器决定踢我,我会发送重新登录请求。

我的问题:如果响应无效,我会异步重新登录(响应的 JavaFX 回调)并继续。由于多线程任务,可能存在这样一种情况,即 2 个(或更多)请求获得相同的无效响应并尝试重新登录,或者一个任务在另一个正在登录时尝试执行请求(因此没有有效令牌),接收到无效响应,在另一个接收到有效登录时开始登录,在新登录期间该一个将失效,依此类推。

如何强制我的任务等到另一个人请求的登录完成?最好的方法是什么?

感谢和抱歉语法!

4

2 回答 2

1

这似乎是访问共享资源的情况。您对锁定/等待的直觉是正确的。同步方法对您来说似乎是一个很好的解决方案。如果不是,请使用Semaphore

于 2013-10-15T13:12:11.770 回答
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();
    }
}
于 2013-10-15T13:34:48.250 回答