http://blog.csdn.net/elvis809...
这篇文章里说浏览器每刷新一次或者不同的浏览器浏览该页面,sum的值都会加1。
这就是线程不安全
我想到有状态和无状态的对象基本概念:
有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。
无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。一般是singleton scope。
那么问题来了,JSP生成的servlet是单例还是原型?
servlet就我所知是单例多线程模式,就算是jsp也是一样,只在第一次请求时创建该servlet的对象,因此web应用第一次访问servlet的速度都会比之后访问慢
jsp的<%! %>写法相当于类里写成员变量写成员方法,而<% %>相当于在servlet的service方法里写东西
你说的什么单例、原形模式的,我有点不太理解,servlet因为是单例模式,你想用成员变量又不进行同步操作,还在方法里操作他,这本身就是线程不安全的,危险的一b
说实话我想半天还是不太明白你要问的是什么,你链接里那个例子在sum++前面加个sleep(5000),再同时开两个页面,看看最后出来的数两个页面是相等还是一个比另一个大1就知道线程安全不安全了
那个 sum 值是记录请求次数吗?JSP换个说法就是页面版的Servlet,JSP和Servlet根本就是一个东西,只是是不同的表现,看看生成JSP生成的Java代码就知道了。Servlet是无状态的,实例是应用容器创建
线程安全是指多个线程访问而不会冲突,单例是指对象实例只有一个,原型好像叫克隆更贴切,这都不适合servlet的使用场景