Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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
appserver中的Java并发_Java_Multithreading_Dictionary_Concurrency_Hashmap - Fatal编程技术网

appserver中的Java并发

appserver中的Java并发,java,multithreading,dictionary,concurrency,hashmap,Java,Multithreading,Dictionary,Concurrency,Hashmap,我有一个带有CRUD操作的小型web应用程序。对于数据,我不能使用db,所以我必须将其存储在map或类似的数据结构中。根据要求,我需要两个地图来存储和访问数据,并且我必须确保它们彼此同步。 现在的问题是,在多线程环境中,对两个映射执行crud操作的首选方法是什么,以确保它们处于一致状态。是否有更好的方法或模式来避免锁定和同步 谢谢我认为必须要有一些同步。您可以尝试以下方法。 首先,对两个映射使用ConcurrentHashMap。然后将两个映射封装在一个对象中,该对象将具有同步方法,以确保数据处

我有一个带有CRUD操作的小型web应用程序。对于数据,我不能使用db,所以我必须将其存储在map或类似的数据结构中。根据要求,我需要两个地图来存储和访问数据,并且我必须确保它们彼此同步。 现在的问题是,在多线程环境中,对两个映射执行crud操作的首选方法是什么,以确保它们处于一致状态。是否有更好的方法或模式来避免锁定和同步


谢谢

我认为必须要有一些同步。您可以尝试以下方法。 首先,对两个映射使用
ConcurrentHashMap
。然后将两个映射封装在一个对象中,该对象将具有同步方法,以确保数据处于一致状态。以下是一个例子:

public class ParentMap {
   private ConcurrentHashMap<String, Object> map1 = new ConcurrentHashMap<>();
   private ConcurrentHashMap<String, Object> map2 = new ConcurrentHashMap<>();

   public synchronized void add(Object objectToAdd) {
      // Add to map1 
      // Add to map2
   }

   public synchronized void update(String key, Object object) {
      // Update the object based on the key on both maps (following the rules of your application)
   }

   public synchronized void delete(String key) {
      // Delete in both maps following the rules of your application
   }

   public Object get(String key) {
      // Use the rules of your application to read
   }
}
公共类ParentMap{
私有ConcurrentHashMap map1=新ConcurrentHashMap();
私有ConcurrentHashMap map2=新ConcurrentHashMap();
公共同步作废添加(对象对象添加){
//添加到map1
//添加到map2
}
公共同步无效更新(字符串键、对象){
//基于两个贴图上的键更新对象(遵循应用程序的规则)
}
公共同步作废删除(字符串键){
//按照应用程序的规则在两个映射中删除
}
公共对象获取(字符串键){
//使用应用程序的规则阅读
}
}

确保应用程序中只有一个
ParentMap
对象。您可以使用单例模式来实现这一点。

我认为必须涉及一些同步。您可以尝试以下方法。 首先,对两个映射使用
ConcurrentHashMap
。然后将两个映射封装在一个对象中,该对象将具有同步方法,以确保数据处于一致状态。以下是一个例子:

public class ParentMap {
   private ConcurrentHashMap<String, Object> map1 = new ConcurrentHashMap<>();
   private ConcurrentHashMap<String, Object> map2 = new ConcurrentHashMap<>();

   public synchronized void add(Object objectToAdd) {
      // Add to map1 
      // Add to map2
   }

   public synchronized void update(String key, Object object) {
      // Update the object based on the key on both maps (following the rules of your application)
   }

   public synchronized void delete(String key) {
      // Delete in both maps following the rules of your application
   }

   public Object get(String key) {
      // Use the rules of your application to read
   }
}
公共类ParentMap{
私有ConcurrentHashMap map1=新ConcurrentHashMap();
私有ConcurrentHashMap map2=新ConcurrentHashMap();
公共同步作废添加(对象对象添加){
//添加到map1
//添加到map2
}
公共同步无效更新(字符串键、对象){
//基于两个贴图上的键更新对象(遵循应用程序的规则)
}
公共同步作废删除(字符串键){
//按照应用程序的规则在两个映射中删除
}
公共对象获取(字符串键){
//使用应用程序的规则阅读
}
}

确保应用程序中只有一个
ParentMap
对象。您可以使用单例模式进行此操作。

您好,非常感谢您的回复。这也是我的想法;但是,我想知道是否有一种替代的无锁方法?我不认为有一种方法没有锁,否则最终会出现不一致的状态。即使在使用数据库时,在后台也会涉及一些锁定。使用mysql作为RDBM示例,它具有表级锁定或行级锁定。对于nosql数据库,如mongodb,它具有集合级锁定或文档级锁定。您好,非常感谢您的回复。这也是我的想法;但是,我想知道是否有一种替代的无锁方法?我不认为有一种方法没有锁,否则最终会出现不一致的状态。即使在使用数据库时,在后台也会涉及一些锁定。使用mysql作为RDBM示例,它具有表级锁定或行级锁定。对于nosql数据库(如mongodb),它具有集合级锁定或文档级锁定。