【发布时间】:2021-12-23 13:48:57
【问题描述】:
我有这样的方法
public Object doSomethingExpensive(String x);
现在,如果我处理了这个方法,我可以将结果保存在 HashMap 中,例如,它们的键是字符串 x,值是结果对象。
如果该地图中存在数据,我不必再次处理它。
但现在我几乎同时收到两个请求。 在这种情况下,我想让第二个请求等待,直到第一个请求完成,第二个请求也可以在计算后得到第一个请求的结果,所以我不必计算两次或并行两次。
关键是,我不能用
public synchronized Object doSomethingExpensive(String x);
因为如果 String x 是其他东西,Object 就是其他东西。 所以我需要在那个字符串 x 上进行一些同步。
但 synchronized(x) 是不可能的,因为 java 中的字符串文字......
另外,如果没有字符串而是对象作为 x,那么我可能会在第二个请求中获得与请求 1 相关的内容相同的类似对象,但它们每个都是其他一些对象。
是的,所以我的问题是,如何解决这个问题,如何防止并行计算 String x 其结果两次,如何同步它并将结果缓存在 HashMap 中。
【问题讨论】:
标签: java multithreading caching hashmap synchronized