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

时间:2016-09-19 10:49:31

标签: java multithreading servlets synchronization

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

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

在并发方案中,如果存在调度任务正在更新对象的情况,而有请求要求Servlet过滤器进行验证。因此,规则显然没有更新以进行验证。

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

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

我是否知道是否有任何可行的解决方案?

补充一些源代码以阐明描述 XMLObject和ThirdPartyFilter由jar中的第三方提供。     class XMLObject {         私人名单规则;         // getter和setter     }

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

     }
}

调度程序使用反射来检索在上面的Filter中初始化的静态xmlObj。

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

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

关注的是,当正在执行Scheduler.updateXMLObj()时,同时ThirdPartyFilter正在doFilter()中执行验证,验证规则不是最新的。 我希望如果Scheduler.updateXMLObj()正在进行中,XMLObject将被锁定,以便ThirdPartyFilter无法读取它以进行验证。它可行吗?

0 个答案:

没有答案