我打算创建一个实时计数器。因此,一个用户可以增加特定键的计数器值。而另一个则通过 ajax 请求(在循环中或使用某种长轮询方法)获取更新的计数值。我将使用 spring 控制器,它将注入服务类我可以执行如下操作,还是有更好的方法:
@Service
public MyService{
//instance variable in spring injected service class, not sure if this correct
static final Map<String, Integer> myMap;
public void add(String key){
Integer count = myMap.get(key);
count++;
myMap.put(key, count);
}
//accessed via ajax loop (and controller), if value changes update display
public Integer getCount(String key){
return myMap.get(key)
}
@PostConstruct
public load(){
myMap = new HashMap<String, Integer>(10){{//initialize}};
}
Edit有几个答案,但尚不清楚哪个是最好的:同步添加方法?在另一个类(带注释的存储库)中创建映射并注入它?还有别的吗?
可以,但需要注意这些问题:
- 地图最初是空的,但你从不检查空计数器;
- add() 方法不会修改地图中的计数器。由于 Integer 是不可变的,因此您需要在递增计数器后将其放回映射中。或者您需要在地图内存储可变计数器
- 多个线程在没有任何同步的情况下访问地图,这将导致错误、不稳定的行为或异常
- 如果您的应用程序集群在多个服务器之间,此策略显然会失败
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)