Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在独立的非集群环境中部署的Restful web服务中,我们需要使用线程安全的数据结构吗?_Java_Multithreading_Resteasy_Concurrentmodification - Fatal编程技术网

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

Java 在独立的非集群环境中部署的Restful web服务中,我们需要使用线程安全的数据结构吗?,java,multithreading,resteasy,concurrentmodification,Java,Multithreading,Resteasy,Concurrentmodification,我在非集群独立设置中部署了一个Restful Web服务。。 正如我们所知,多个线程将自动生成,以满足来自多个客户端到此Web服务中定义的任何端点的请求。。 请注意,我的终端没有显式生成线程 我在其中一个服务/业务方法中使用HashMap。我在地图中迭代,在某些情况下从地图中删除一些数据 1.为多个客户端生成的多个线程是否在HashMap对象的同一副本上工作 2.是否建议在上述场景中使用ConcurrentHashMap,即使每个线程都使用自己的HashMap副本 放置代码段:-

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

我在其中一个服务/业务方法中使用HashMap。我在地图中迭代,在某些情况下从地图中删除一些数据

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

2.是否建议在上述场景中使用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;

        }
Map方法1(项目itm){
映射featureEntityMap=itm.getFeatureEntities();//itm来自方法参数
Map propertyFilterMap=new HashMap();//方法要构造并返回的新映射
Set keySet=featureEntityMap.keySet();
迭代器itr=keySet.Iterator();
while(itr.hasNext()){
字符串特性名称=(字符串)itr.next();
if(featureName.contains(“.”+lable.toLowerCase())){
字符串拆分[]=featureName.split(“\\”);
如果从featureEntityMap中删除(split!=null&&!LABEL_-SPECIFIC_-PROPERTIES.contains(split[0]){//基于条件的数据
List itemList=Arrays.asList(featureEntityMap.get(featureName.getValueAsString().split(“\\s*,\\s*”));
itr.remove();
propertyFilterMap.put(拆分[0],项目列表);
}
}
}
返回属性过滤映射;
}

问题是“是否必须为featureEntityMap使用ConcurrentHashMap?”

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

好的,那么对于您的问题,关于您调用的多个会话或“线程”所使用的hashMap“object”的简短回答将不同

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

现在当你说

我正在遍历映射,在某些情况下会从映射中删除一些数据

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

但是,如果您使用map进行某种事务,这将影响其他会话,您需要仔细考虑


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

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

请发布一个显示您如何声明和使用此HashMap的帖子谢谢…我刚刚用代码片段编辑了我的帖子…我从您的评论中了解到的是在我的场景中对featureEntityMap使用ConcurrentHashMap不是强制性的。请澄清。在您的情况下似乎没有必要。但是,如果您仍然对自己的代码流有疑问,并且不确定映射的更改是否会对多个会话产生影响,可以使用ConcurrentHashMap对其进行同步。