java 成员变量的线程安全

本文深入探讨了Java中成员变量的线程安全问题,特别是在单例模式下。静态变量在多线程环境中易引发安全问题,而实例变量在单例模式下也变得不安全。通过代码示例,展示了如何通过多线程访问和修改FieldsVo类的静态和实例变量,从而揭示了静态数据和单例实例变量的线程不安全性。调整Spring配置,将单例改为原型模式后,实例变量变得线程安全。最后,建议避免在单例中使用非常量成员变量,或考虑同步控制以确保线程安全,但这样可能影响性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           本文讲解的是关于java成员变量的线程安全问题,包括静态变量和实例变量。静态变量好理解,所有实例都共享一份内存,任何对静态变量的修改都会引发线程安全问题。然而,对于实例变量,在大多数情况下的访问和修改都是线程安全的。但是,当这个类,在系统里面被实现为单例模式时,由于整个系统中,只存在一份对象内存,所以,系统的各线程对该实例变量的修改则又会引发线程安全问题。这种情况别说是java新手容易犯的疏忽,就算是有一定经验的java程序员也会不小心地犯错,况且,有些时候由于知识范围或者其他原因,程序员根本不知道正在使用的实例就是一个单例(比如,从工厂中获取到的实例、struts1中的action、spring容器中默认的scope就是singleton等等)。

         下面使用代码对此说明。代码由三个类组成:FieldsVo 包含有两个成员变量(静态和实例的)用于在多线程中访问、FieldValueWatcher继承自Thread用于模拟对FieldsVo 类的访问、Test测试类。

          先来看看第一个VO类,很简单,只有两个成员变量:静态和实例,和两个对应的修改器和访问器

        

          线程检测类:FieldValueWatcher

        

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值