JAVA 使用 类 在线程之间同步操作

JAVA synchronize operations between threads using classes

我目前正在尝试创建一种可靠的 UDP 协议,其中我的服务器向我的客户端发送每个 1024 字节的数据包,当它完成一个 send/receive 周期时,服务器等待并且客户端发送一个命令到服务器的 TCP 告诉它什么数据包没有收到(我使用前 2 个字节作为数据包 ID [类型短]),然后服务器收到远程通知 class 并发送丢失的数据包。

private void waitUntilNotified() {
    synchronized (this) {
        try {
            System.out.println("Waiting..." + new Date());
            waiting = true;
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Stop waiting");
    }
}

public void notifyThis(){
    synchronized (this) {
        if(waiting){
            waiting = false;
            notify();
            System.out.println("Notified " + new Date());
            return;
        }
    }
}

我的问题是有时在本地测试中命令在服务器开始等待之前到达,因此导致它永远等待。

我在想是否有一种万无一失的方法来确保即使触发 notifyThis() 的命令在服务器触发 waitUntilNotified() 函数之前出现,它仍然会通知它并更改等待状态?

如果有任何不清楚的地方,请发表评论,我会尽力解释。

TL:DR,我正在寻找一种仅在服务器开始 wait() 之后才调用 notify() 的方法,即使调用是在它开始等待

之前进行的

在我看来,您真正需要的是更高级别的并发原语。这里有一些可能性:

或者可能是某种 QueueDeque.


问题(对我们来说)是我们无法看到您实际上是如何使用 wait / notify 方法的,因此不清楚您真正需要什么。

但作为一个一般原则,从长远来看,识别和使用适当的更高级别的并发性 class 比尝试实现自己的并发性要好来自基本构建块。

并且...正如@D.B 所指出的...在UDP 之上实施您自己的"reliable" 传输是在重新发明轮子。 TCP 是显而易见的选择,如果您这样做是为了获得 "better than TCP" 性能,还有其他选择。