Java-servlet多线程的疑惑

发布于 2017-01-13 11:01:53 字数 122 浏览 1139 评论 3

servlet在容器中是单例的,多线程是由servlet容器提供或者说支持的,那么它是怎么保证线程安全,我看很多文章,说是serlvet的单例在不同的线程中调用,那这样的话,servlet岂不不是线程安全的了,我对多线程了解的不深

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

想挽留 2017-07-24 08:35:30

Servlet由Web容器负责的创建的,当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例,所以说servlet是线程不安全的。
如果要保证线程安全,可以采用如下手段:
1、使用synchronized同步。
2、使用Lock同步。
3、使用ThreadLocal(实际上就是一个HashMap),这样不同的线程维护自己的对象,线程之间相互不干扰。
对于提出的1-3的解决方案是可行的.
更简单的是, 在servlet中尽量使用局部变量,每个线程独有自己的这些局部变量.如果无可避免的要使用实例变量,可以使用无状态的对象。推荐用这种方法来避免线程安全的问题。
这样数据就不会出现问题。

偏爱自由 2017-07-04 01:13:25

Servlet本身不是线程安全的 所以LZ以后在写程序的时候注意 尽量不要在Servlet中使用对象属性 就算用了 这些属性也应当不会在每次请求的时候被改动

虐人心 2017-02-11 03:20:43

首先要肯定的是servlet是单例的,他不是线程安全的。
线程不安全的原因是因为java中所有的实例变量对于多个线程都是共享的,所以在运行多个线程的时候,可能有的线程会拿到不是自己的线程的实例变量。
为了保证线程安全,当然同步是一种不错的方法,但是同步会造成阻塞,如果访问的用户过多,这个时候,从感觉上就会觉得服务器非常的慢。
因此使用同步也只能饮鸩止渴。
但是如果我们不使用实例变量,那么对于同步的问题也就不用过多的去考虑了。
(实例变量也就是java的普通成员变量,区分与类变量也就是静态成员变量)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文