我有我的(Java)代碼的關鍵部分,基本上像下面的代碼片段。他們從nio服務器進來。異步原子陣列
void messageReceived(User user, Message message) {
synchronized(entryLock) {
userRegistry.updateLastMessageReceived(user,time());
server.receive(user,message);
}
}
但是,我的消息的很大比例不會改變服務器狀態,真的。他們只是客戶說「你好,我還在這裏」。我真的不希望在同步模塊內部做到這一點。
我可以使用同步映射或類似的東西,但它仍然會產生同步懲罰。
我真的很想做的是有一些像一個下拉框,這樣
void messageReceived(User user, Message message) {
dropbox.add(new UserReceived(user,time());
if(message.getType() != message.TYPE_KEPT_ALIVE) {
synchronized(entryLock) {
server.receive(user,message);
}
}
}
我有一個清理程序來自動把那些不活躍睡覺客戶。因此,清理例程可以簡單地在單個同步塊中編譯保持活動的消息,而不是在每個保持活動的消息上同步以更新註冊表。因此,自然而然地,重新構建對此的需求,我做的第一件事就是開始制定解決方案。然後我決定這是一個非平凡的課程,而且這個問題很可能相當普遍。所以我在這裏。
tl; dr是否有Java庫或其他解決方案我可以用來促進以原子方式以異步方式添加到對象列表?不需要以異步方式從列表中收集數據。我只是不想在每次添加到列表上進行同步。
您的收存箱是否需要跟蹤用戶發出的所有「嗨,我還在這裏」的消息,還是最後一個?如果更晚,您可以使用Map來存儲它們,並覆蓋以前的任何地址。避免一些「這可能會增長很大」的問題。顯然你需要一個處理併發的Map。 –
user949300
@ user949300:我認爲保管箱OP的討論需要跟蹤所有消息,包括那些不是心跳的消息。現在,也許只有最後一次心跳纔可以,但Dropbox仍然需要包含所有非心跳信息。 *(至少這是以上代碼的樣子)* – TacticalCoder
@ user949300它只需要最後一個。但是,我預計(可能錯誤地)找到一張原子圖是非常困難的。我的代碼中已經有了你所描述的地圖,但我不希望更新它到同步塊中(除非我在一個塊中完成所有的更新)。我認爲這也解決了988052的評論。 – corsiKa