HttpSession 数据同步
1:第一种方式,把对象的属性定义为immutable,synchronized同步更新Public class HighScore { public final String name; public final int score; public HighScore(String name, int score) { this.name = name; this.score = score; }}public PlayerScore getHighScore() { ServletContext ctx = getServletConfig().getServletContext(); return (PlayerScore) ctx.getAttribute("highScore");}public void updateHighScore(PlayerScore newScore) { ServletContext ctx = getServletConfig().getServletContext(); PlayerScore hs = (PlayerScore) ctx.getAttribute("highScore"); synchronized (lock) { if (newScore.score > hs.score) ctx.setAttribute("highScore", newScore); }} orpublic PlayerScore getHighScore() { ServletContext ctx = getServletConfig().getServletContext(); AtomicReference<PlayerScore> holder = (AtomicReference<PlayerScore>) ctx.getAttribute("highScore"); return holder.get();}public void updateHighScore(PlayerScore newScore) { ServletContext ctx = getServletConfig().getServletContext(); AtomicReference<PlayerScore> holder = (AtomicReference<PlayerScore>) ctx.getAttribute("highScore"); while (true) { HighScore old = holder.get(); if (old.score >= newScore.score) break; else if (holder.compareAndSet(old, newScore)) break; } }
第二种方式: 一般一个用户同时只有一个请求,如果使用ajax可能出现并行多个请求,这样我们可以再controller层控制同时只有一个请求被处理,SpringMVC AbstractController类提供了相应的实现....
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)throws Exception {// Delegate to WebContentGenerator for checking and preparing.checkAndPrepare(request, response, this instanceof LastModified);// Execute handleRequestInternal in synchronized block if required.if (this.synchronizeOnSession) {HttpSession session = request.getSession(false);if (session != null) {Object mutex = WebUtils.getSessionMutex(session);synchronized (mutex) {return handleRequestInternal(request, response);}}}return handleRequestInternal(request, response);}
页:
[1]