网站计数器代码编写时的疑问
时间:2011-08-14
来源:互联网
以下用文字表述代码实现的网站计数器逻辑:
服务器站点有个计数的文件
<%! 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?
服务器站点有个计数的文件
<%! 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?
作者: m2214419115 发布时间: 2011-08-14
假设两个用户U1,U2同时访问
没有synchronized的话,代码的实际执行可能会变成这样的顺序:
U1 -- count=A()
U2 -- count=A()
U1 -- count++
U1 -- B(count)
U2 -- count++
U2 -- B(count)
在这个例子中,两个用户访问,但计数器只加了1
合并成一个函数并不能避免这个问题,只要不是原子级的操作,它就有可能在中途被插入别的线程的指令运行
所以要消除Bug,还是用synchronized加锁吧
没有synchronized的话,代码的实际执行可能会变成这样的顺序:
U1 -- count=A()
U2 -- count=A()
U1 -- count++
U1 -- B(count)
U2 -- count++
U2 -- B(count)
在这个例子中,两个用户访问,但计数器只加了1
合并成一个函数并不能避免这个问题,只要不是原子级的操作,它就有可能在中途被插入别的线程的指令运行
所以要消除Bug,还是用synchronized加锁吧
作者: alexandertech 发布时间: 2011-08-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28