From 6c00f26e1364697d4a0b4e22107c87a4851c1ec9 Mon Sep 17 00:00:00 2001 From: jinyu Date: Fri, 22 Jul 2016 14:04:33 +0800 Subject: [PATCH] =?UTF-8?q?weixin4j-base:=E8=8E=B7=E5=8F=96cache=E6=97=B6?= =?UTF-8?q?=E5=8A=A0=E9=94=81=E5=A4=84=E7=90=86(via=20=E9=A3=8E=E8=BD=A6?= =?UTF-8?q?=E8=BD=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 4 +++- .../foxinmy/weixin4j/cache/CacheManager.java | 21 ++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGE.md b/CHANGE.md index b1fe8e8c..3bffe1a7 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -735,4 +735,6 @@ * 2016-07-22 - + weixin4j-base:主要调整退款相关类与官网一致 \ No newline at end of file + + weixin4j-base:主要调整退款相关类与官网一致 + + + weixin4j-base:获取cache时加锁处理(via 风车车) \ No newline at end of file diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/cache/CacheManager.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/cache/CacheManager.java index 808bca27..ff9d9485 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/cache/CacheManager.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/cache/CacheManager.java @@ -1,5 +1,8 @@ package com.foxinmy.weixin4j.cache; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; + import com.foxinmy.weixin4j.exception.WeixinException; /** @@ -14,6 +17,7 @@ import com.foxinmy.weixin4j.exception.WeixinException; public class CacheManager { protected final CacheCreator cacheCreator; protected final CacheStorager cacheStorager; + private final ReentrantLock lock = new ReentrantLock(); public CacheManager(CacheCreator cacheCreator, CacheStorager cacheStorager) { @@ -30,9 +34,20 @@ public class CacheManager { public T getCache() throws WeixinException { String cacheKey = cacheCreator.key(); T cache = cacheStorager.lookup(cacheKey); - if (cache == null) { - cache = cacheCreator.create(); - cacheStorager.caching(cacheKey, cache); + try { + if (cache == null && lock.tryLock(3, TimeUnit.SECONDS)) { + try { + cache = cacheStorager.lookup(cacheKey); + if (cache == null) { + cache = cacheCreator.create(); + cacheStorager.caching(cacheKey, cache); + } + } finally { + lock.unlock(); + } + } + } catch (InterruptedException e) { + throw new WeixinException("get cache error on lock", e); } return cache; }