Java-servlet多线程的疑惑
servlet在容器中是单例的,多线程是由servlet容器提供或者说支持的,那么它是怎么保证线程安全,我看很多文章,说是serlvet的单例在不同的线程中调用,那这样的话,servlet岂不不是线程安全的了,我对多线程了解的不深
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
servlet在容器中是单例的,多线程是由servlet容器提供或者说支持的,那么它是怎么保证线程安全,我看很多文章,说是serlvet的单例在不同的线程中调用,那这样的话,servlet岂不不是线程安全的了,我对多线程了解的不深
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
Servlet由Web容器负责的创建的,当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例,所以说servlet是线程不安全的。
如果要保证线程安全,可以采用如下手段:
1、使用synchronized同步。
2、使用Lock同步。
3、使用ThreadLocal(实际上就是一个HashMap),这样不同的线程维护自己的对象,线程之间相互不干扰。
对于提出的1-3的解决方案是可行的.
更简单的是, 在servlet中尽量使用局部变量,每个线程独有自己的这些局部变量.如果无可避免的要使用实例变量,可以使用无状态的对象。推荐用这种方法来避免线程安全的问题。
这样数据就不会出现问题。
Servlet本身不是线程安全的 所以LZ以后在写程序的时候注意 尽量不要在Servlet中使用对象属性 就算用了 这些属性也应当不会在每次请求的时候被改动
首先要肯定的是servlet是单例的,他不是线程安全的。
线程不安全的原因是因为java中所有的实例变量对于多个线程都是共享的,所以在运行多个线程的时候,可能有的线程会拿到不是自己的线程的实例变量。
为了保证线程安全,当然同步是一种不错的方法,但是同步会造成阻塞,如果访问的用户过多,这个时候,从感觉上就会觉得服务器非常的慢。
因此使用同步也只能饮鸩止渴。
但是如果我们不使用实例变量,那么对于同步的问题也就不用过多的去考虑了。
(实例变量也就是java的普通成员变量,区分与类变量也就是静态成员变量)