Java 使用WeakHashMap解决数据丢失/并发问题

Java 使用WeakHashMap解决数据丢失/并发问题,java,minecraft,Java,Minecraft,我正在用Java开发一个程序,它的客户端需要在服务器端存储数据/属性/etc。我希望确保当两个不同的代码位访问相同的客户机数据、编辑和保存时,不会发生数据丢失 我的想法是最初使用一个弱值的WeakHashMap。本质上,每当线程/进程/etc试图访问客户机数据包装器对象时,用户管理器将检查该数据对象是否已经存在于内存中(如果另一位代码正在处理该用户,或者该用户当前处于联机状态,则会发生这种情况)。如果它不存在于内存中,它将从文件加载,并存储在弱哈希映射中,否则它将返回现有的数据对象 本质上,我试

我正在用Java开发一个程序,它的客户端需要在服务器端存储数据/属性/etc。我希望确保当两个不同的代码位访问相同的客户机数据、编辑和保存时,不会发生数据丢失

我的想法是最初使用一个弱值的WeakHashMap。本质上,每当线程/进程/etc试图访问客户机数据包装器对象时,用户管理器将检查该数据对象是否已经存在于内存中(如果另一位代码正在处理该用户,或者该用户当前处于联机状态,则会发生这种情况)。如果它不存在于内存中,它将从文件加载,并存储在弱哈希映射中,否则它将返回现有的数据对象

本质上,我试图为存在的每个单独的数据文件创建一个类似于单例的系统,但是出于内存的原因,我仍然需要确保当每个用户不在使用时,不要将它们存储在内存中


我只是好奇,这是弱散列映射的有效用法,还是我从错误的角度解决了这个问题?作为参考,我正在谈论的。(userCache是讨论中的weakhashmap)。诚然,这是一段相当古老的代码,但我正在为另一个平台从头开始重写该项目,因此我认为如果我做得不对,我还不如趁机会把它做好。

您似乎需要一个LRUCache(LRU=最近使用最少的),您可以在上面指定保留在映射中的元素数量。每次插入后,都会进行检查,以确定是否要移除最近访问的元素。有很多实现。这是一个带有普通LinkedHashMap的简单示例:

import java.util.LinkedHashMap;
import java.util.Map;

public LRUCache<K, V> extends LinkedHashMap<K, V> {
  private int cacheSize;

  public LRUCache(int cacheSize) {
    super(16, 0.75, true);
    this.cacheSize = cacheSize;
  }

  protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    return size() >= cacheSize;
  }
}
import java.util.LinkedHashMap;
导入java.util.Map;
公共LRUCache扩展LinkedHashMap{
私有int缓存大小;
公共LRUCache(int cacheSize){
超级(16,0.75,真);
this.cacheSize=cacheSize;
}
受保护的布尔重构(Map.Entry最早){
返回大小()>=缓存大小;
}
}

本例中的链接哈希映射将根据访问保持哈希映射的顺序,由接受3个参数的构造函数指定。然后,“removeEldestEntry”实现只需检查大小是否足够大,就可以删除地图上最老的元素(在本例中是访问最少的元素)。

我是否正确理解您在项目中使用番石榴?如果是-它有一个完美的组成部分为您的情况: