Java静态变量小感

声明一个static int 变量,在多个线程中对他进行操作,就会出现数据异常的问题,

问:

那么我们在日常情况下应该如何正常,正确的使用static关键字呢,是一定要和final关键字联合使用吗,
还是什么样的变量可以用static声明什么样的最好不要

----------------------------------------------------------------下面是我获得到的我想要的答案

答:

就是我们平常web开发中,很少会使用主动使用多线程,但是还有一种多线程情况就是每个用户都是一个
线程,当访问量很大的时候是不是也就是多线程了呢,可是这种时候你使用非静态成员变量是没问题的,
因为每个用户都是不同的实例,每个用户都是new的新的类对象,所以类中的变量也都是互相不干扰的,
也就是线程安全的,但如果是静态变量,就是多用户共享,也就是多线程共享,
所以多个用户同时修改数据时就会出现问题,难道我们平常开发中每次使用静态变量都要考虑线程安全
问题吗

追问:

日常web开发中如果不使用多线程,是不用考虑线程安全的问题的对吧。

但是如果使用了静态变量,即使不开启多线程,也要考虑多线程安全问题对吗,
因为每个用户都是多个线程,都会同时操作静态变量

追答:

大哥,你这是另一个问题了,我是针对你刚刚的问题答的。如果要针对你现在的问题,
平常不管是用Spring还是Servlet,都是单例的,会在不同请求线程之间共享,
所以其不管是实例变量还是静态变量都会被共享。如果确定要共享,那么需要确保线程安全性。
但是如果要在多个请求间共享可变变量呢?根据业务场景不同而不同,
可以采用我上述提到的java自带的机制及加锁等,也可以采用消息队列,数据库,redis.

追答:

还有一点要纠正你一下,不是只有静态变量才会被共享,一个实例变量被多个线程使用时也是被共享的。
日常web开发,每个http请求一个线程。如果你不涉及共享可变变量,是不需要考虑线程安全性的。
如果你想共享一些信息,对于传统单体应用来说,简单点可以通过session来共享。 
还有点,你关于线程安全的东西,建议你去补补理论基础。推荐一本经典书:<<Java并发编程实战>> 
国外大牛写的,不是国内的那本。

回复 xbynet:
好的 ,谢谢 ,我刚试了下,您说的对,不是静态变量也会被共享

Guess you like

Origin blog.csdn.net/Maxiao1204/article/details/119415589