gpt4 book ai didi

java - 如何正确使用 VAVR 集合是线程安全的?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:20:41 25 4
gpt4 key购买 nike

VAVR 集合是“不可变的”。

那么,如果我有静态变量,例如,保存所有 WebSocket session ,我将如何使用 VAVR 以使集合是线程安全的?

例如:

@ServerEndpoint("/actions")
public class DeviceWebSocketServer {

private static Set<Session> sessions = //???; // how should I initialize this?

@OnOpen
public void open(Session session) {
sessions = sessions.add(session); // is this OK???
}

@OnClose
public void close(Session session) {
sessions = sessions.remove(session); // is this OK??
}
}

最佳答案

您可以将不可变的 vavr 集合包装在可原子更新的 AtomicReference 中,并使用其中一种更新方法以原子方式更新对不可变集合的引用。

@ServerEndpoint("/actions")
public class DeviceWebSocketServer {

private static AtomicReference<Set<Session>> sessionsRef =
new AtomicReference<>(HashSet.empty());

@OnOpen
public void open(Session session) {
sessionsRef.updateAndGet(sessions -> sessions.add(session));
}

@OnClose
public void close(Session session) {
sessionsRef.updateAndGet(sessions -> sessions.remove(session));
}

}

确保您阅读了 AtomicReference 的 javadoc如果您打算在其他情况下使用它们,因为需要遵守更新功能的一些要求以获得正确的行为。

关于java - 如何正确使用 VAVR 集合是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48908219/

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