我写了一个股票市场模拟器,它使用 aConcurrentHashMap
作为缓存。
缓存包含大约 75 个元素,但它们的更新和检索速度非常快(大约每秒 500 次)。
这是我所做的:
线程 1:
连接到一个外部系统,该系统为我提供给定股票代码的流式报价。
线程 2(回调线程):
等待外部系统将数据传递给它。一旦它得到数据,它就会解析它,创建一个不可变的 DataEntry 对象,缓存它并向 thread3 发送一个信号。
线程 3(消费者线程): 收到信号后,从缓存中检索 DataEntry 并使用它。(不让 thread2 直接将数据推送到 thread3 是任务的一部分)。
public final class DataEntry{
private final String field1;
private final String field2;
//...
private final String field25;
// Corresponding setters and getters
}
public final class Cache{
private final Map<String, DataEntry> cache;
public Cache( ){
this.cache = new ConcurrentHashMap<String, DataEntry> ( 65, 0.75, 32 );
}
// Methods to update and retrieve DataEntry from the cache.
}
通过分析器运行它后,我注意到我正在创建很多DataEntry
对象。因此伊甸园很快就被填满了。
所以,我正在考虑通过以下方式调整设计:
a)使DataEntry
类可变。
b)DataEntry
用空对象预先填充缓存。
c)当更新到达时,DataEntry
从地图中检索对象并填充字段。
这样,DataEntry
对象的数量将是恒定的并且等于元素的数量。
我的问题是:
a)这个设计是否存在我通过使DataEntry
可变变量引入的任何并发问题。
b)我还能做些什么来优化缓存吗?
谢谢。