六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 33|回复: 0

HttpSession 数据同步

[复制链接]

升级  42%

29

主题

29

主题

29

主题

秀才

Rank: 2

积分
113
 楼主| 发表于 2013-1-23 02:25:13 | 显示全部楼层 |阅读模式
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);}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表