永发信息网

servlet是单例吗?线程安全吗

答案:1  悬赏:30  手机版
解决时间 2021-03-02 14:12
servlet是单例吗?线程安全吗
最佳答案
servlet是线程安全的吗?这个问题,在网上没有看到一个确切的答案,所以我们来分析一下:
首先什么是线程安全?
引用概念:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

我们都知道servlet是多线程的,同时一个servlet实现类只会有一个实例对象,也就是它是Singleton的,所以多个线程是可能会访问同一个servlet实例对象的。

每个线程都会为数据实例对象开辟单独的引用,那么servlet会是线程安全的吗?

要判断是否是线程安全,我们需要知道线程安全问题是由什么引起的。
搜索得到答案:线程安全问题都是由全局变量及静态变量引起的。

这是网上找到的一个描述:很多年前调查过的一个bug, 那时我们系统中遗留的代码中写了很多全局变量,有一次发布后,客户反馈,当有多人同时进行某个操作时,我们的数据出了问题,那时我们调查后的结果就是:多人同步操作时,有些全局变量的值不对了,之后我们专门设一个人花了很多工夫来将所有全局变量都改成了局部变量了,并且项目要求以后不允许用全局变量。原来那时侯我就已经碰到过线程不安全的情况了啊,不过处理方式或者不用全局,或者加入同步,若加入同步同时也要考虑一下对程序效率会不会产生影响。

由此可知,servlet是否线程安全是由它的实现来决定的,如果它内部的属性或方法会被多个线程改变,它就是线程不安全的,反之,就是线程安全的。

在网上找到一个例子,如下:

public class TestServlet extends HttpServlet {
private int count = 0;

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("");
response.getWriter().println(this + " ==> ");
response.getWriter().println(Thread.currentThread() + ":
");
for(int i=0;i<5;i++){
response.getWriter().println("count = " + count + "
");
try {
Thread.sleep(1000);
count++;
} catch (Exception e) {
e.printStackTrace();
}
}
response.getWriter().println("");
}
}

当同时打开多个浏览器,输入http://localhost:8080/ServletTest/TestServlet时,显示的结果不同,这就说明了对于属性count来说,它是线程不安全的,
为了解决这个问题,将代码重构,如下:

public class TestServlet extends HttpServlet {
private int count = 0;
private String synchronizeStr = "";
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("");
response.getWriter().println(this + " ==> ");
response.getWriter().println(Thread.currentThread() + ":
");
synchronized (synchronizeStr){
for(int i=0;i<5;i++){
response.getWriter().println("count = " + count + "
");
try {
Thread.sleep(1000);
count++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
response.getWriter().println("");
}
}
参考 http://blog.csdn.net/zyl1042635242/article/details/47416487 收起
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
西浦联谊会在什么地方啊,我要过去处理事情
设f(x)是偶函数,若曲线y=f(x)在点(1,f(
龙猫吃桃干可以吗,桃干,还有平常能吃什么零
春竹羊绒在哪里啊,我有事要去这个地方
我现在在电缆厂上班,单位要我写做徒弟的感想
【雕塑小品】常见的园林雕塑小品有()和动物雕
其底下一个系是什么字
把我吓得( ) 简直容易得( ) 真是好吃的(
剑网3万花PVP技能 怎样才能从小白变成大神
谁知道摩擦网的摩擦是干嘛用的?手机里的应用.
民间借贷4分合法吗
经桥式整流后电压是输出端的多少?在整流桥后
过年给孩子买点什么新年礼物好?儿童新年礼物
高仿普拉达包包在淘宝怎么买,价格一般多少
gtx765m和660m和860M的TDP多少瓦,想想
推荐资讯
1.5米的钢管重1.2千克,问一米的钢管重多少
iPad1怎么下载东西 app上不能下载
读甲、乙、丙三幅图,根据图中提供的信息完成
作出fx=2/x的绝对值的分段函数图像
鲁东大学专科有学前教育专业吗?
梦见猫追我
请问各位大仙 怎么知道自己适合供奉哪个财神
鲁二饭店地址在哪,我要去那里办事
一个正方形被分5个相等的长方形每个长方形的
如何设置acca考试的短信通知
配股如何操作,配股的流程是怎样的?
红花、绿叶!这植物叫什么?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?