Java 如何应用Lock/ReadWriteLock来同步对象?
我正在运行一个Servlet,其中有一个第三方Servlet过滤器根据外部化xml中定义的规则执行一些验证。Servlet将xml解析为一个对象,Servlet过滤器读取该对象进行验证。 因为这个Servlet是由第三方提供的,所以我无法修改/扩展它,因为有协议 有一个计划的任务读取外部化的xml并定期更新对象 在并发场景中,如果计划任务正在更新对象,而有请求请求Servlet过滤器进行验证。因此,规则显然没有更新以进行验证 我想确保的是,每当对象发生更新时,任何正在进行的验证都应该暂停。因此Servlet过滤器中的每个验证都在读取xml中定义的更新规则 刚刚扫描的ReadWriteLock似乎是一个完美的解决方案。但是它需要在读取对象的操作中添加readLock().lock(),这对于我的情况似乎不可行(如上所述,我无法修改或扩展过滤器) 请问有没有可行的解决办法 补充一些源代码以澄清说明 XMLObject和ThirdPartyFilter由jar中的第三方提供。 类XMLObject{ 私人名单规则; //接二连三 } 上述代码已经在Servlet应用程序中运行良好 问题在于,在执行Scheduler.updateXMLObj()时,第三方过滤器在doFilter()中执行验证,验证规则不是最新的。Java 如何应用Lock/ReadWriteLock来同步对象?,java,multithreading,servlets,synchronization,Java,Multithreading,Servlets,Synchronization,我正在运行一个Servlet,其中有一个第三方Servlet过滤器根据外部化xml中定义的规则执行一些验证。Servlet将xml解析为一个对象,Servlet过滤器读取该对象进行验证。 因为这个Servlet是由第三方提供的,所以我无法修改/扩展它,因为有协议 有一个计划的任务读取外部化的xml并定期更新对象 在并发场景中,如果计划任务正在更新对象,而有请求请求Servlet过滤器进行验证。因此,规则显然没有更新以进行验证 我想确保的是,每当对象发生更新时,任何正在进行的验证都应该暂停。因此S
我希望如果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
}
}