在部署在独立非集群环境中的 Restful Web 服务中,我们是否需要使用线程安全数据结构?



我在非集群独立设置中部署了一个 Restful 网络服务。 众所周知,将自动生成多个线程,以满足来自多个客户端到此 Web 服务中定义的任何端点的请求。 请注意,我这边没有显式生成线程。

我在一种服务/业务方法中使用哈希图..我正在遍历地图,在某些情况下从地图中删除一些数据。

1.为多个客户端生成的多个线程是否在 HashMap 对象的同一副本上工作?

2.Is 建议在上述场景中使用 ConcurrentHashMap,即使每个线程都使用自己的 HashMap 副本?

放置代码片段:-

Map<String,List<String>> method1(Item itm){
Map<String, FeatureEntity> featureEntityMap = itm.getFeatureEntities();// itm comes from method parameter
Map<String,List<String>> propertyFilterMap = new HashMap<String,List<String>>();//new Map to be constructed and returned by method
Set<String> keySet = featureEntityMap.keySet();
Iterator itr = keySet.iterator();
while(itr.hasNext()){
String featureName = (String) itr.next();
if(featureName.contains("."+lable.toLowerCase())){
String split [] = featureName.split("\.");
if(split!=null && !LABEL_SPECIFIC_PROPERTIES.contains(split[0])){//based on condition data is deleted from featureEntityMap
List<String> itemList = Arrays.asList(featureEntityMap.get(featureName).getValueAsString().split("\s*,\s*"));
itr.remove();
propertyFilterMap.put(split[0],itemList );
}
}
}
return propertyFilterMap;
}

问题是"是否必须对 featureEntityMap 使用 ConcurrentHashMap ?

下面的答案是基于对您的问题的一般理解,因为缺少您的案例的特定代码。

好的,因此,对于您关于多个会话或"线程"正在使用的hashMap"对象"的问题,您的简短回答将有所不同。

除非你实现了单例,否则每个"线程"都将创建自己的HashMap对象。

现在当你说;

我正在遍历地图,在某些情况下从地图中删除一些数据

如果要在映射中添加和删除的内容完全包含在该会话中,并且对任何其他会话(或线程(没有影响,则应该没问题。

但是,如果您使用地图进行某种交易,这将影响其他会话,您需要仔细考虑!

例如,您正在从文件中获取属性,更改它们并更新文件,或者说您正在根据映射内容进行一些数据库更新或插入,或任何其他会影响其他线程逻辑的此类活动,那么您将需要同步您的 HashMap(使用 ConcurrentHashMap(

线程安全是一个问题,仅当 Web 服务保持某种状态时 - 即在多次调用服务之间存活的一些数据,并可能影响后续调用的逻辑和结果。这意味着此数据由服务的不同调用共享,并且在并发调用的情况下,多个线程可以同时访问此数据。在这种情况下,代码必须是线程安全的。在您的示例中,不同调用之间没有数据存在。这意味着每个调用/线程都会创建自己的一组对象,这些对象不在不同线程之间共享。因此,在您的情况下,线程安全不是问题

相关内容

最新更新