Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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 如何应用Lock/ReadWriteLock来同步对象?_Java_Multithreading_Servlets_Synchronization - Fatal编程技术网

Java 如何应用Lock/ReadWriteLock来同步对象?

Java 如何应用Lock/ReadWriteLock来同步对象?,java,multithreading,servlets,synchronization,Java,Multithreading,Servlets,Synchronization,我正在运行一个Servlet,其中有一个第三方Servlet过滤器根据外部化xml中定义的规则执行一些验证。Servlet将xml解析为一个对象,Servlet过滤器读取该对象进行验证。 因为这个Servlet是由第三方提供的,所以我无法修改/扩展它,因为有协议 有一个计划的任务读取外部化的xml并定期更新对象 在并发场景中,如果计划任务正在更新对象,而有请求请求Servlet过滤器进行验证。因此,规则显然没有更新以进行验证 我想确保的是,每当对象发生更新时,任何正在进行的验证都应该暂停。因此S

我正在运行一个Servlet,其中有一个第三方Servlet过滤器根据外部化xml中定义的规则执行一些验证。Servlet将xml解析为一个对象,Servlet过滤器读取该对象进行验证。 因为这个Servlet是由第三方提供的,所以我无法修改/扩展它,因为有协议

有一个计划的任务读取外部化的xml并定期更新对象

在并发场景中,如果计划任务正在更新对象,而有请求请求Servlet过滤器进行验证。因此,规则显然没有更新以进行验证

我想确保的是,每当对象发生更新时,任何正在进行的验证都应该暂停。因此Servlet过滤器中的每个验证都在读取xml中定义的更新规则

刚刚扫描的ReadWriteLock似乎是一个完美的解决方案。但是它需要在读取对象的操作中添加readLock().lock(),这对于我的情况似乎不可行(如上所述,我无法修改或扩展过滤器)

请问有没有可行的解决办法

补充一些源代码以澄清说明 XMLObject和ThirdPartyFilter由jar中的第三方提供。 类XMLObject{ 私人名单规则; //接二连三 }

上述代码已经在Servlet应用程序中运行良好

问题在于,在执行Scheduler.updateXMLObj()时,第三方过滤器在doFilter()中执行验证,验证规则不是最新的。
我希望如果Scheduler.updateXMLObj()正在进行,XMLObject将被锁定,这样ThirdPartyFilter就无法读取它进行验证。它可行吗?

用你的代码更新问题Servlet中没有过滤链吗?你不能在你的黑盒前后放置你的过滤器,并在那里添加锁定吗?如果你在
web.xml
文件中定义你的过滤器,那么你可以控制它们的执行顺序,所以只需在第三方过滤器之前添加一个新的过滤器,并在新的过滤器中进行锁定每当对象发生更新时,任何正在进行的验证都应暂停。“这不是你想要的。您希望在进行验证时不会更新对象,反之亦然。除非你真的想用旧版本验证一半,用新版本验证另一半。@MarkoTopolnik是的。web.xml中有一个过滤器链。您能否说明如何在第三方过滤器之前的另一个过滤器中实现锁定?我已经补充了代码供您参考。谢谢
class ThirdPartyFilter implements Filter{
     private static XMLObject xmlObj;
     static{
         //some code to parse the external xml to get the rules
         xmlObj = new XMLObject;
         xmlObj.setRules(rules);
     }
     doFilter(){
         List<Rule> rules = xmlObj.getRules();
         //do validation here

     }
}
@Configuration
@EnableScheduling
class Scheduler{
     @Scheduled(fixedDelay=600000) //execute this function every 10 minutes
     public void updateXMLObj(){
         //parse external xml and update the xmlObj
     }
}