** * 采用分布式锁进行 * * */ @Service public class DistributedLock { private final static Logger LOGGER = LoggerFactory.getLogger(DistributedLock.class); public final static Long TIMEOUT=Const.DL_TIMEOUT; @Resource private DealWithByRedis dealWithByRedis; /** * 获取锁操作 * * @return */ public boolean getLock(String LOCK_KEY) { boolean flag = false; // 默认没有获得锁 /** * 循环获取值 */ while (!flag) { flag = dealWithByRedis.setnx( LOCK_KEY, String.valueOf(System.currentTimeMillis() + TIMEOUT + 1)); if (flag) { // 已经获取了这个锁 然后跳出循环 // flag = true; //LOGGER.info("********获取分布式锁********"); break; } String rtTimestamp = dealWithByRedis.get(LOCK_KEY); if (rtTimestamp != null && !"".equals(rtTimestamp.trim())) { // 判断是否不为空 // 从redis获取的时间戳 Long rtLongTimestamp = Long.valueOf(rtTimestamp); // 当前的时间戳 Long rtCurrentTimestamp = System.currentTimeMillis(); if (rtLongTimestamp < rtCurrentTimestamp) { // 查看LOCK_KEY这个KEY是否过期 // 如果过期,则 String rtTimestamp2 = dealWithByRedis.getSet( LOCK_KEY, String.valueOf(System.currentTimeMillis() + TIMEOUT + 1)); // 调用getset方法获取之前的时间戳 if (rtTimestamp2 != null && rtTimestamp.equals(rtTimestamp2)) { // 如果刚获取的时间戳和之前获取的时间戳一样的话,说明没有其他线程在占用这个锁,则此线程可以获取这个锁. flag = true; // 获取锁标记 //return flag; break; } // else if (rtTimestamp2 != null // && rtTimestamp.equals(rtTimestamp2)) {// // 如果不一样的话,则说明已经有其他线程占用了这个锁. } } /** * 暂停100ms,重新循环 */ try { Thread.sleep(100); } catch (InterruptedException e) { System.out.println(" e=" + e.getCause()); } } return flag; } /** * 释放锁操作 */ public void releaseLock(String KEY) { dealWithByRedis.del(KEY); } }