A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马亚冲 黑马帝   /  2011-8-14 16:54  /  2176 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下用文字表述代码实现的网站计数器逻辑:
服务器站点有个计数的文件


<%!   int count = 0;
     得到文件中的count    A()
     保存count到文件函数  B(count)
%>

<%
    if(新的session){
        synchronized(this){
           count = A();
           count ++;
            B(count);
        }

     }
%>

<H1>输出count的值<H1>


请解释一下,
(1)为什么需要synchronized
(2)如果我将A()和B()写成一个函数,是不是就不用synchronized锁了??
(3)(2)中的将A()和B()合并成一个函数后(我的代码是合并的,没有synchronized),我打开浏览器是第15位访客(此时刷新页面,15不变),我再打另外一个浏览器显示第16位访客;可是如果此时帅新前一个浏览器打开的页面,则它变成了16,这又怎么解释,如果消除bug?

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

3 个回复

倒序浏览
1.    不用synchronized: 如果多人同时访问,,都调用 的A(),,这时可能A()都是一样的值……  
   而锁住后,只能有一个人进去取的A(),同时更新好B()……

2.    写成一个,,也是跟 1的问题一样……

3.    新开启一个浏览器窗口就是一个新的session,所以15会变成16,,,而在同一个窗口中,
  利用链接打开的其他新窗口,,还是在当前session中。
    消除bug:你意思是同IP不能算了?那你条件弄成判断IP的。。这个比较通用。。
[ 本帖最后由 石宗银 于 2011-08-15  15:00 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-11 02:46:36
藤椅

回复 沙发 的帖子

现在我才看到.....

明白了 十分感谢!!!!.
回复 使用道具 举报
黑马网友  发表于 2011-9-11 13:26:53
板凳
首先,线程同步是为了解决共享相同内存变量的情况.
不管程序是不是在一个函数中,都是需要用synchronized 来实现同步的.
因为计算机是无法控制线程的执行顺序的,比如:[code]while(true)
{
      int a[i]=i;
      i++;
}[/code]如果上面程序不使用同步,A,B 2个线程同时启动,当A线程运行完"a[5]=5;"时,程序跳转到B线程,由于" i++;"还未执行,i仍然等于5,于是B线程又重复给a[5]赋值,而就不能实现给a[6]赋值了.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马