Restful部署在单机非集群环境下的web服务,是否需要使用线程安全的数据结构?
In Restful web service deployed in a standalone non cluster environment, do we need to use thread safe data structures?
我在非集群独立设置中部署了一个 Restful 网络服务..
正如我们所知,将自动生成多个线程以满足来自多个客户端的请求到此 web 服务中定义的任何端点。
请注意,我这边没有明确生成线程..
我在 service/business 方法之一中使用 HashMap ..我正在遍历 Map 并在某些情况下从 Map 中删除一些数据..
1.Are 为多个客户端生成的多个线程在 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;
}
问题是"is it mandatory to use a ConcurrentHashMap for featureEntityMap ??"
以下答案基于对您问题的一般理解,因为您的案例缺少具体代码。
好的,所以关于 hashMap "object" 被多个会话使用或 "threads" 的问题的简短回答将不一样。
除非您实现了单例,否则每个 "thread" 都将创建它自己的 HashMap 对象。
现在当你说;
I am iterating through the Map and in certain cases removing some data from the Map
如果您在地图中添加和删除的内容完全包含在该会话中并且对任何其他会话(或线程)没有影响,您应该没问题。
但是如果你用map做一些交易,会影响到其他session,你要考虑清楚!
例如,您正在从文件中获取属性、更改它们并更新文件,或者说您正在根据您的地图内容进行一些数据库更新或插入,或者任何其他会影响的 activity其他线程的逻辑,那么你需要同步你的HashMap(使用ConcurrentHashMap)
线程安全是一个问题,只有当您的 Web 服务保持某种状态时 - 即某些数据在对您的服务的多次调用之间存在并且可能影响后续调用的逻辑和结果。这意味着此数据由您的服务的不同调用共享,并且在并发调用的情况下可能会被多个线程同时访问。在这种情况下,您的代码必须是线程安全的。在您的示例中,不同调用之间没有数据存在。这意味着每个 invocation/thread 创建自己的一组对象,这些对象不在不同线程之间共享。因此,在您的情况下,线程安全 NOT 是一个问题。
我在非集群独立设置中部署了一个 Restful 网络服务.. 正如我们所知,将自动生成多个线程以满足来自多个客户端的请求到此 web 服务中定义的任何端点。 请注意,我这边没有明确生成线程..
我在 service/business 方法之一中使用 HashMap ..我正在遍历 Map 并在某些情况下从 Map 中删除一些数据..
1.Are 为多个客户端生成的多个线程在 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;
}
问题是"is it mandatory to use a ConcurrentHashMap for featureEntityMap ??"
以下答案基于对您问题的一般理解,因为您的案例缺少具体代码。
好的,所以关于 hashMap "object" 被多个会话使用或 "threads" 的问题的简短回答将不一样。
除非您实现了单例,否则每个 "thread" 都将创建它自己的 HashMap 对象。
现在当你说;
I am iterating through the Map and in certain cases removing some data from the Map
如果您在地图中添加和删除的内容完全包含在该会话中并且对任何其他会话(或线程)没有影响,您应该没问题。
但是如果你用map做一些交易,会影响到其他session,你要考虑清楚!
例如,您正在从文件中获取属性、更改它们并更新文件,或者说您正在根据您的地图内容进行一些数据库更新或插入,或者任何其他会影响的 activity其他线程的逻辑,那么你需要同步你的HashMap(使用ConcurrentHashMap)
线程安全是一个问题,只有当您的 Web 服务保持某种状态时 - 即某些数据在对您的服务的多次调用之间存在并且可能影响后续调用的逻辑和结果。这意味着此数据由您的服务的不同调用共享,并且在并发调用的情况下可能会被多个线程同时访问。在这种情况下,您的代码必须是线程安全的。在您的示例中,不同调用之间没有数据存在。这意味着每个 invocation/thread 创建自己的一组对象,这些对象不在不同线程之间共享。因此,在您的情况下,线程安全 NOT 是一个问题。