以下用文字表述代码实现的网站计数器逻辑:
服务器站点有个计数的文件
<%!   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.   

    假设两个用户U1,U2同时访问没有synchronized的话,代码的实际执行可能会变成这样的顺序:U1 -- count=A()
    U2 -- count=A()
    U1 -- count++
    U1 -- B(count)
    U2 -- count++
    U2 -- B(count)在这个例子中,两个用户访问,但计数器只加了1
    合并成一个函数并不能避免这个问题,只要不是原子级的操作,它就有可能在中途被插入别的线程的指令运行
    所以要消除Bug,还是用synchronized加锁吧
      

  2.   

    synchronized表示的是同步,防止数据出问题