我利用OSCache作为缓存,写了一个Filter来缓存页面。
碰到一个比较迷惑的问题,如果两个线程同时访问同一个页面。会造成缓存写入2次啊。
比如:
try {
/* 查询缓存内容是否已经存在 */ (1)
} catch (NeedsRefreshException ex) {
/* 没有命中,生成页面并写入缓存 */ (2)
}本来试过用读写锁来应对的,可是同时可以多个读就会产生问题。两个线程同时访问同一个页面,两个线程肯定是同时都没有命中进入(2)运行了。
现在是把整个try块都用synchronized (this){}包起来,但这样会降低并发速度。
想请问,这里如何来同步比较好?
我看过OSCache自带的一个Filter(com.opensymphony.oscache.web.filter.CacheFilter),里面好像根本就没有考虑同步。
碰到一个比较迷惑的问题,如果两个线程同时访问同一个页面。会造成缓存写入2次啊。
比如:
try {
/* 查询缓存内容是否已经存在 */ (1)
} catch (NeedsRefreshException ex) {
/* 没有命中,生成页面并写入缓存 */ (2)
}本来试过用读写锁来应对的,可是同时可以多个读就会产生问题。两个线程同时访问同一个页面,两个线程肯定是同时都没有命中进入(2)运行了。
现在是把整个try块都用synchronized (this){}包起来,但这样会降低并发速度。
想请问,这里如何来同步比较好?
我看过OSCache自带的一个Filter(com.opensymphony.oscache.web.filter.CacheFilter),里面好像根本就没有考虑同步。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货