300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > java 全局变量线程安全_Java线程安全问题指的是全局变量 还是静态变量?

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

时间:2022-03-29 00:37:00

相关推荐

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

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

1、静态变量

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

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

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

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

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

2、全局变量

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

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

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。