1 Star 0 Fork 0

heyifan/MarkDownNote

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
experience.md 3.37 KB
一键复制 编辑 原始数据 按行查看 历史
heyifan 提交于 2021-03-24 23:10 . a

序列化以及serialversionUID变量

Serializeble接口可以将对象序列化为字节码流,方便在网络上传输和硬盘存储

SerialversionUID在没有声明时,Java会自动生成个默认的id,但这个默认生成的ID对这个class的细节非常敏感,反序列化时可能会导致InvalidClassException这个异常。SerialVersionUID是用来辅助对象的序列化与反序列化的,原则上序列化后的数据当中的SerialVersionUID与当前类当中的SerialVersionUID一致,那么该对象才能被反序列化成功。这个SerialVersionUID的详细的工作机制是:在序列化的时候系统将SerialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的SerialVersionUID是否跟当前的文件的SerialVersionUID是否一致,如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化

Spring中bean是否线程安全

Spring 的 bean 作用域(scope)类型 1、singleton:单例,默认作用域。

2、prototype:原型,每次创建一个新对象。

3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。

4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。

5、global-session:全局会话,所有会话共享一个实例。

线程安全这个问题,要从单例与原型Bean分别进行说明。

原型Bean 对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

单例Bean 对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身

有状态对象(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的。每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean

无状态对象(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的

对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法,比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。

使用ThreadLocal的好处 使得多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,因为ThreadLocal为每个线程保存线程私有的数据。这是一种以空间换时间的方式。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/hyf216/mark-down-note.git
git@gitee.com:hyf216/mark-down-note.git
hyf216
mark-down-note
MarkDownNote
master

搜索帮助

Cb406eda 1850385 E526c682 1850385