Java线程安全问题指的是全局变量,还是静态变量?

售前免费咨询热线: 4 0 0 - 1 8 6 - 0 9 0 5
汇智资讯Huizhi information

当前位置:首页 »Java线程安全问题指的是全局变量,还是静态变量?

Java线程安全问题指的是全局变量,还是静态变量?

日期:2020-10-19 10:54:16 访问量: 来源:

这个问题的答案是静态变量和全局变量都可能引起线程安全问题。这两种变量引起线程安全问题的原因和区别如下:

1、静态变量

静态变量即静态成员变量。只要有修改变量值的操作,无论是在单例或者非单例都是线程不安全的;而如果线程只是读取变量的值,而不会改变变量的值,这种情况下则是线程是安全的。

产生线程安全问题的原因:静态变量即类变量,只初始化一次,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

静态变量多线程操作示例:

Java线程安全

根据上图代码可知,当线程1执行了number = 1; number = 2; 后,线程2获得执行权,number = 1;然后当线程1获得执行权执行打印第二次获取number时; 必然输出结果“获取第二次number = 1”,按照这个模拟,我们可能会在控制台看到输出为“获取第二次number = 1”的结果。如下图方框中的数据:

Java线程安全

上图结果显示了静态变量线程不安全问题。

2、全局变量

全局变量即实例成员变量。如果线程只是读取变量的值,而不会改变变量的值,则无论是单例还是非单例都是线程安全的;如果有修改变量值的操作,则单例模式因为只有一个对象实例singleton存在,多线程同时操作时是不安全的,而非单例模式下多线程操作是安全的。

实例变量为对象实例私有,在虚拟机的堆heap中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全(如,springmvc controller是单例的,非线程安全的);如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全(如,struts2 action默认是非单例的,每次请求在heap中new新的action实例,故struts2 action可以用实例成员变量)。

全局变量多线程操作示例:

Java线程安全

多线程操作同一个对象的全局变量,结果如下图:

Java线程安全

上图结果显示了全局变量线程不安全问题。

汇聚行业精英智慧

致力于高端IT技术人才培养

助力万千学员成就IT梦!

汇智动力

扫码关注 领取资料

www.hzdledu.cn

相关阅读Reading

全国热线:400-186-0905

总部热线:028-6547-1147

周一至周日9:30-24:00

我要咨询
汇智动力微信

汇智动力微信公众号

')