melin 发表于 2013-1-23 02:25:13

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]
查看完整版本: HttpSession 数据同步