Java 保留对象的最新版本

Java 保留对象的最新版本,java,multithreading,performance,concurrency,jvm,Java,Multithreading,Performance,Concurrency,Jvm,我需要以多线程方式从源读取数据。源可以包含各种资源的消息。为了确保快速阅读,我使用多线程阅读。同一资源可能有多条消息,在这种情况下,我只想保留最新的消息 class Message { String id; String data; long timeStamp } 我正试图找出处理这件事的最佳方法。考虑到我将以多线程方式阅读,不确定哪种数据结构最适合?id为键的ConcurrentHashMap?在这种情况下,我需要检查密钥是否存在。如果有,则比较消息并在必要时更新

我需要以多线程方式从源读取数据。源可以包含各种资源的消息。为了确保快速阅读,我使用多线程阅读。同一资源可能有多条消息,在这种情况下,我只想保留最新的消息

class Message {

    String id;
    String data;
    long timeStamp
}

我正试图找出处理这件事的最佳方法。考虑到我将以多线程方式阅读,不确定哪种数据结构最适合?id为键的ConcurrentHashMap?在这种情况下,我需要检查密钥是否存在。如果有,则比较消息并在必要时更新。如果在比较这两个版本时,可能会出现第三个版本的消息到达并更新,因为当时我不会使用写锁。在检查和更新周围添加同步块是唯一的方法吗?有什么有效的建议吗?

如果只是阅读,您可以使用变量前的
volatile
关键字来指示JVM,多个线程可以同时访问它。这样,您就不会受到过时数据的影响

另一方面,如果要同时修改变量,则需要锁定(使用
synchronized
block或非内部锁定)<代码>易失性提供可见性、锁定-可见性和原子性

附言:摘自本书

我需要以多线程方式从源读取数据

如果您从单个源读取数据,并且处理不是时间密集型的,则可能无法从多线程中获得任何好处。相反,它会损害性能。人们普遍认为“多线程”意味着“让事情变得更快”

id为键的ConcurrentHashMap?那样的话,我需要检查一下 如果密钥存在。如果有,则比较消息并在必要时更新 必要的。如果在比较两个版本时,可能会出现第三个版本 邮件的版本到达并更新,因为我不会接受 在那个时候写锁

使用
ConcurrentHashMap.compute()
。它锁定密钥(以及地图的一部分)以防止任何无序更新。类似下面的内容

Message newMsg = getFromSomewhere();
map.compute(id, (k, oldVal) -> {
    if(oldVal == null) // First value for this key
        return newMsg;

    // Compare the timestamp and return the newer one as the new value in the map
    if(oldVal.getTimestamp() > newMsg.getTimestamp())
        return oldVal;

    return newMsg;
});

为了获得额外的(CPU限制的)性能,您可以尝试使用
ConcurrentHashMap(int-initialCapacity,float-loadFactor,int-ConcurrentyLevel)
构造函数对映射进行微调。

到目前为止您尝试过什么吗?请分享您的努力,如果需要,人们可以帮助您更正提供消息的来源。您如何访问它?如果资源有多条消息,会返回所有消息吗?@Kris:不寻找代码,只是一种方法。@user7:是的。我将获得资源的所有消息。一个选项是首先获取所有资源的所有消息,然后开始清除每个资源的过时消息。。然而,我发现这有点低效。要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于堆栈溢出来说是离题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作