集群环境中利用Memcached CAS原子操作计数
2013-10-16 17:55
525 查看
利用Memcached CAS原子操作,确保集群/多线程环境汇总累加操作是有效的,而不会覆盖其他线程的累加结果。
package org.pile.memcached; import java.io.IOException; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.pile.util.LogWriter; import net.spy.memcached.CASValue; public class CASLockServlet extends HttpServlet { //private static final int[] LEVEL = {10,50,200,500,1000,5000,10000,20000}; private static final String CACHE_KEY = "CASLOCK"; private volatile static AtomicInteger visitTimes = new AtomicInteger(); //private Random random = new Random(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String responseBody = null; if(null != request.getParameter("reset")){ visitTimes = new AtomicInteger(); MemCache.setCache(CACHE_KEY, 0, 0); LogWriter.printLog("Reset servlet status."); ResponseBuilder.buildResponse("Reset ok!", response); return; } if(null != request.getParameter("print")){ responseBody = "Servlet Object value ::" + visitTimes.intValue(); responseBody += " Memcached Object value ::" + MemCache.getCache(CACHE_KEY).toString(); LogWriter.printLog("Print servlet status."); ResponseBuilder.buildResponse(responseBody, response); return; } int step = 1; visitTimes.addAndGet(step); LogWriter.printLog("Update local value::" + visitTimes.intValue()); while(true){ LogWriter.printLog("Begin to get CASValue::" + visitTimes.intValue()); CASValue<Object> casValue = MemCache.getCasId(CACHE_KEY); LogWriter.printLog("End to get CASValue::" + casValue.getValue().toString()); int cachTimes = Integer.parseInt(casValue.getValue().toString()) + step; if(MemCache.casCache(CACHE_KEY, casValue.getCas(), String.valueOf(cachTimes))){ LogWriter.printLog("Success to CAS Cache::" + cachTimes); break; } else{ LogWriter.printLog("Fail to CAS Cache::" + cachTimes); try{ Thread.sleep(200); } catch(Exception exp){ exp.printStackTrace(); } } } } }
相关文章推荐
- 基于C++ STL利用CAS原子操作封装的无锁list
- 利用magent搭建memcached集群
- 在64位的环境下利用Jet来操作Access,Excel和TXT
- 多线程环境下对变量的读写操作的原子性问题(一道百度笔试题引发的思考)
- 多线程环境下对变量的读写操作的原子性问题【baidu】
- 【Linux】多线程无锁编程--原子计数操作:__sync_fetch_and_add等12个操作
- volatile、synchronized、锁的升级、原子操作、总线锁、缓存锁、CAS
- Apache+mod_jk+Tomcat+Memcached win32集群环境搭建
- 在linux环境下搭建memcached集群(一)
- 在linux环境下搭建memcached集群(二)
- 在64位的环境下利用Jet来操作Access,Excel和TXT
- Linux下安装搭建Memcached集群环境
- unix环境高级编程-3.11-原子操作
- CAS原子操作实现无锁及性能分析
- wamp环境 安装memcached具体操作
- java多线程环境下对变量的读写操作的原子性问题
- linux(CentOS7)上搭建hadoop2.7分布式集群环境完整操作实战
- 本地虚拟机集群环境ip地址更换后的操作
- CAS原子操作实现无锁及性能分析
- 利用magent搭建memcached集群