stateless java_有状态(Stateful)与无状态(Stateless)

stateless java_有状态(Stateful)与无状态(Stateless)1 有状态 Stateful 有数据存储功能 有状态对象 StatefulBean 就是有实例变量的对象 可以保存数据 类里面有成员变量 而且成员变量是可变的 是非线程安全的 在不同方法调用间不保留任何状态 2 无状态 Stateless 一次操作 不能保存数据 无状态对象 StatelessBea 就是没有实例变量的对象 不能保存数据 类里面没有成员变量 或者有成员变量但是不可变的

1.有状态(Stateful):

有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,类里面有成员变量,而且成员变量是可变的,是非线程安全的。在不同方法调用间不保留任何状态。

2.无状态(Stateless):

一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,类里面没有成员变量,或者有成员变量但是不可变的、或者成员变量是单例的,是不变类,是线程安全的。

3.Spring中的有状态(Stateful)和无状态(Stateless)

(1).通过上面的分析,相信大家已经对有状态和无状态有了一定的理解。无状态的Bean适合用不变模式,技术就是单例模式,这样可以共享实例,提高性能。有状态的Bean,多线程环境下不安全,那么适合用Prototype原型模式。Prototype: 每次对bean的请求都会创建一个新的bean实例。

(2).默认情况下,从Spring bean工厂所取得的实例为singleton(scope属性为singleton),容器只存在一个共享的bean实例。

(3).理解了两者的关系,那么scope选择的原则就很容易了:有状态的bean都使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

(4).如Service层、Dao层用默认singleton就行,虽然Service类也有dao这样的属性,但dao这些类都是没有状态信息的,也就是相当于不变(immutable)类,所以不影响。Struts2中的Action因为会有User、BizEntity这样的实例对象,是有状态信息的,在多线程环境下是不安全的,所以Struts2默认的实现是Prototype模式。在Spring中,Struts2的Action中,scope要配成prototype作用域。

4.Servlet、Struts中的有状态和无状态:

(1).Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web 容器负责的。一个Servlet类在Application中只有一个实例存在,也就是有多个线程在使用这个实例。这是单例模式的应用。无状态的单例是线程安全的,但我们如果在Servlet里用了实例变量,那么就变成有状态了,是非线程安全的。Out,Request,Response,Session,Config,Page,PageContext是线程安全的,Application在整个系统内被使用,所以不是线程安全的.

(2).Struts1也是基于单例模式实现,也就是只有一个Action实例供多线程使用。默认的模式是前台页面数据通过actionForm传入,在action中的excute方法接收,这样action是无状态的,所以一般情况下Strunts1是线程安全的。如果Action中用了实例变量,那么就变成有状态了,同样是非线程安全的。

(3).Struts2默认的实现是Prototype模式。也就是每个请求都新生成一个Action实例,所以不存在线程安全问题。需要注意的是,如果由Spring管理action的生命周期, scope要配成prototype作用域。

(4).如何解决Servlet和Struts1的线程安全问题,当我们能比较好的理解有状态和无状态的原理,自然很容易得出结论:不要使用有状态的bean,也就是不要用实例变量。如果用,就要用prototype模式

5.总结:

Stateless无状态用单例Singleton模式,Stateful有状态就用原型Prototype模式。

Stateful 有状态是多线程编码的天敌,所以在开发中尽量用Stateless无状态,无状态是不变(immutable)模式的应用,有很多优点:不用管线程和同步的问题,如果值是不可变的,程序不用担心多个线程改变共享状态,所以可以避免线程竞争的bugs. 因为没有竞争,就不用用locks等机制,所以无状态的不变机制,也可以避免产生死锁现象。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205084.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:50
下一篇 2026年3月19日 下午6:51


相关推荐

  • java代码到opcode_OPcode简介

    java代码到opcode_OPcode简介运行一段 PHP 代码主要有两个阶段 编译和执行 当然编译过程中还包括词法分析语法分析不同阶段和细节 这里我们将其作为一个整体 在这两个阶段之间 PHP 代码会被编译成 opcode 可以将其认为是引擎的一个中间语言 编辑阶段把 PHP 源码生成 opcode 然后在执行阶段执行这些 opcode 这篇文章将简单的介绍 opcode PHP 代码编译之后会生成许多的 op 每一个 op 都是一个 zend op 类型

    2026年3月17日
    1
  • JDK1.8源码(三)——java.lang.String 类

    JDK1.8源码(三)——java.lang.String 类JDK1.8源码(三)——java.lang.String类

    2022年7月4日
    20
  • idea怎么取消多行注释_idea注释快捷键哪里修改

    idea怎么取消多行注释_idea注释快捷键哪里修改1、一次性添加多行注释的快捷键首先选中要注释区域,然后ctrl+/    这个是多行代码分行注释,每行一个注释符号ctrl+shift+/  这个是多行代码注释在一个块里,只在开头和结尾有注释符号2、取消多行注释快捷键怎样添加快捷键的,用相同方法取消,如ctrl+/ 添加注释,则ctrl+/取消注释ctrl+shift+/添加注释,则ctr

    2022年8月15日
    8
  • debug版本和release版本的区别

    debug版本和release版本的区别nbsp nbsp Debug 通常称为调试版本 它包含调试信息 并且不作任何优化 便于程序员调试程序 Release 称为发布版本 它往往是进行了各种优化 使得程序在代码大小和运行速度上都是最优的 以便用户很好地使用 nbsp nbsp Debug 和 Release 的真正秘密 在于一组编译选项 下面列出了分别针对二者的选项 nbsp Debug 版本 nbsp nbsp MDd MLd 或 MTd 使用 Debugr

    2026年3月17日
    2
  • Docker离线安装教程「建议收藏」

    Docker离线安装教程「建议收藏」一、基础环境Centos7环境下载docker包,我们演示的是19.3.12下载地址将下载好的压缩包上传至服务器下二、开始安装解压docker包tar-zxvfdocker-19.03.12.tgz将解压后的文件复制到/usr/bin下cpdocker/*/usr/bin将docker注册为servicevi/etc/systemd/system/docker.service复制下列配置到docker.service并保存(:wq)[Un

    2026年4月14日
    5
  • 法拉第电磁感应和发电机实验

    法拉第电磁感应和发电机实验看图 转图圆盘 切割磁感线 这就是发电机

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号