package cn.guagua.mobile.common; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.log4j.Logger; import cn.guagua.mobile.cache.redis.Redis; /** * 读写锁控制强制读取缓存同步 * @author shma * @date 2014-10-11 15:04:28 */ public class SynchCacheLock<T> { private static final Logger logger = Logger.getLogger(SynchCacheLock.class); private static Redis.RedisClient redis1 = new Redis.RedisClient("1"); private ReadWriteLock lock = null; private Lock readLock = null; // 读锁 private Lock writeLock = null; // 写锁 public SynchCacheLock() { lock = new ReentrantReadWriteLock(); readLock = lock.readLock(); writeLock = lock.writeLock(); System.out.println(Thread.currentThread().getName() + ">>> cache lock init..."); } public T getCache(String key, Runnable task) { T obj = null; readLock.lock(); try { obj = (T) redis1.getObject(key); if(obj == null) { System.out.println(Thread.currentThread().getName() + " read request " + key + " is null, wait query..."); readLock.unlock(); writeLock.lock(); try { obj = (T) redis1.getObject(key); if(obj == null) { task.run();//强制执行执行写缓存任务 System.out.println(Thread.currentThread().getName() + " read request " + key + " end..."); obj = (T) redis1.getObject(key); } } catch(Throwable e) { System.out.println("readLock error..."); e.printStackTrace(); } finally { readLock.lock(); writeLock.unlock(); } } System.out.println(Thread.currentThread().getName() + " read request " + key + " data..."); } catch(Throwable e) { System.out.println("lock error..."); e.printStackTrace(); } finally { readLock.unlock(); } return obj; } }
时间: 2024-10-13 16:19:51