> 信息中心 >

基础问题关于static

来源:互联网 编辑:从小磊

有网友碰到过这样的问题:基础问题关于static,问题详细内容为:

我们知道就面向对象来说 static所定义的相当于是这个类的共有特征,是所有对象可以进行访问的公共区域。那么我的问题是这样的:
浏览器或者客户端同时发送10个并行请求,static修饰的字段或者函数是否会出现数据混乱,例如第一个请求还没完成(期望值是A),第二个请求(期望值是B)比第一个请求先完成,最后第一个请求的数据和第二个请求的数据变成一样的B了。
因为现在的“工具类”定义是静态的,所以有此疑问。
当然,也可以通过单例解决上诉问题,但是我想知道如果不通过单例(单例会导致排队现象)是否会发生“脏读”情况。

c# java ,我搜你通过互联网收集了相关的一些解决方案,希望对有过相同或者相似问题的网友提供帮助,具体如下:

解决方案1:
这样估计会搞理解一些:
工具类中,static一般修饰的是方法,这个方法不依赖于自身变量,比如说,我们要做一个把大些字母全部变成小些字母的工具类,在这个构成中只有传参和返回值,静态在这里的作用可以理解为这个代码在程序中只有一份,如果这个时候有第二个调用过来,那就必须要第一个执行完。在这个过程中是不存在公共资源的赋值操作的。如果是修饰在成员变量上,那是静态变量,可以简单的理解成在程序运行时有一个公共的存储空间,如果在第一个请求过来时给这段空间赋值了A,在A还没有才做完的时候,第二个操作有赋值了B,紧接着第一次操作接着操作,那肯定是会使用B值的。
所以一般定况下,静态变量慎用,但有些时候我们真的不用避免使用静态变量,就要使用安全锁。
更好理解的是,线程安全问题的隐患是对同一块存储空间有多个线程对其同时进行读写操作,而static只是强制声明了某一块资源是公共资源。工具类是指同时读,所以不会出问题,但是变量可能会有同时读和写的操作,所以可能会出问题。 收获园豆:3
============================================
也就是说静态方法是每个请求相对独立的,并不会因为A调用了方法,B再调用就有可能导致AB目标结果值返回异常。反之静态变量的生命周期是程序运行时一直生存的,所以对他的操作会一直产生影响,直到程序停止运行。
============================================
@TylorChen: 基本上可以这么理解吧,其实确切的原因应该是,多线程调用工具类的静态方法,不会对同一空间造成写的操作,只会读;多线程可能会对静态变量造成同时写的操作,所以就会出问题。我们举个简单的例子,比如博物馆有一副蒙拉丽莎的画,和一支能在画上画图的笔。画就相当于静态变量,笔就相当于静态方法,每个人都可以拿到笔,也都可以在画上画,如果第一个人过来了,拿了笔画了一笔,把笔放下了,笔还是笔没有变,但是画变了;如果第一个人还没有来得及把画的内容复制走,第二个人来了也画了一笔,这个时候第一个人才把画拿走,就出现了第一个人拿到他并不想要的结果,出现了错误。希望这个例子能帮助你理解。
解决方案2:
static只是静态,不是单线程,并发的时候还是需要用锁的才能保证一致,不知道这样说对不对
解决方案3:
这是线程安全问题,推荐阅读 Common Multithreading Mistakes in C# - III: Unsafe Assumptions 收获园豆:2
解决方案4:
感谢大家的回复,其实这是一个我自己忽略掉的非常基础的一个知识。有关于static所修饰的字段、方法的特征没有清晰。静态变量不是线程安全的,而静态方法并不会导致线程不安全。对于字段而言,储存的是一个实际的值或者内存地址,所以当内容变更时会导致连锁反应。

java基础问题

答:整型的包装类存在常量池,一次性把从-128到127之间的所有数都初始化了.当你使用这些数的时候不是创建新对象而是直接从这个常量池里面取值.所以当你赋值127的时候是取的常量池里的127,因此两个对象内存地址一样.而赋值128的时候两个对象分别new对...

java 基础 父类的static 变量和 static 方法 能被...

答:变量可以继承。 但方法就不同了,只因为他是属于一个类的,不需要被实例化,才称之为static方法. 也是因为他是属于一个类的.子类不能覆盖static方法,在调用的时候也是调用父类的static的方法. 呵呵.看你的理解了

Java初级疑问protected static int count = 0

答:因为count是静态变量,静态变量存储在静态存储区,只会被初始化一次,在执行程序时,会对它的值进行改变,当再次要用到它时,它的数据是在上一次操作之后的基础上进行改变的

问一个关于java基础的笔试题。

答:1、static语句块在编译的时候就执行了,所以1a肯定是最新打印出来。 2、为什么new B();的时候会打印A的构造方法值? 因为B是A的子类,在new子类的对象的时候,一定会默认先去调用父类的无参数的构造方法。 即:public B(){ super();//super()这...

【Java基础语法】如何在使用静态方法的时候指定其...

答:举个例子: public void f(int i, char ch, String s){} 这个方法中有三个参数,分别为int类型的i,char类型的ch,String类型的s。这三个参数的类型都已经指定了,如果实际参数类型和对应参数类型不一致,编译器会出现错误。 如何才能做到可以任...

计算机基础知识!static ram断电也不丢失信息吗?

答:读写存储器(RAM) 读写存储器又称随机存取存储器(Random Access Memory)简称RAM,它能够在存储器中任意指 定的地方随时写入或读出信息;当电源掉电时,RAM 里的内容即消失。根据存储单元的工作原理, RAM 又分为静态RAM 和动态RAM。静态RAM 用触...

java基础 帮帮忙

答:看懂那个结果其实并不难的,你只要明白2点就行。 1是所有的程序又是从main()方法开始执行的,2就是要知道for循环的执行流程。 我帮你过一遍吧。 开始时,i=0;接着就是循环了。 step1: i=0;foo('A'),输出A,返回true,foo('B'),输出B,返回tr...

JAVA基础,静态常量与普通常量有啥区别?即加了sta...

答:static修饰表示这个常量是类级别的,无论这个类有多少实例对象,这些实例对象的这个常量都是同一个。

java中,声明基础变量和数组后都有默认值。例如int...

答:首先要看你初始化的int i是在哪里.如果是在static的话默认值是0是可以直接打印的.在类定义的默认值也是0,也可以.但是在方法中定义的要初始化. 起初所有的东西都是new在堆中的,只不过后来有了一个常量池的概念.所以很多常用的都放入常量池了,用的...

JAVA基础测试题

答:1 跟java运行的机制有关,java先加载静态域,static int x=10; ,然后静态块static { x+=5;},static { x/=3;}(虽然位置在后但先运行) ,然后静态方法static void main 所以x=10,x=15,x=5. 2 A因为int [ ] x = new int[25],数组建立后,每...

鍏充簬涓轰粈涔堢簿娑叉槸绾㈣壊镄勭殑闂

对于你的情况建议你先到医院做一下检查,明确诊断后,再进行治疗,不要自行治疗,以免延误病情。

鍏充簬鍗楀畞涓婂埯涓?殑闂??

南宁初中是按地段的吧,要想去好的,要交银子的哦,想进好班,也要加银子的哦

鍏充簬linux涓?敤sudo镓ц?ulimit镞犳碜镓ц?闂??

鍏堢湅ulimit 鏄?暐锛步ttp://baike.baidu.com/view/4832100.htm ... linux涓嫔彲浠ラ

宸茬煡鍏充簬x镄勬柟绋媘x虏-2(m+1)x+m-1=0链変袱涓...

(1)Δ=4(m+1)^2-4*m*(m-1)

鍏充簬鍙岀幆姹借溅镄勪娇鐢ㄦ<title>参谋长请你...

两款车 综合设计 比科帕奇 性价比要高 些 发 机 综合性能 新胜达要优秀 些 *****看本版的精华,你就明白了.---->

鑻辨枃缈昏疟藟鍏充簬鐖辩殑

祝福那些对爱忠诚的人,同情那些在礼教面前轻易迷失自己追逐的人。 或是 祝福那些对爱忠诚的人,同情那些轻易沉迷于拘于礼教的隐性追逐里。

鍏充簬CT镄勯梾棰桡纻

<script> function initEcAd() { document.all.AdLayer1.style.posTop = -200; document.all.AdLayer1.style.visibility = 'visible' document.all.AdLayer2.style.posT...

宸茬煡鍏充簬x镄勪竴鍏冧簩娆℃柟绋媥虏-(1+2k)x+k虏-2=0链...

有两个实数根.△=(2k+1)²-4(k²-2)

寰疯?镄勫彂阔充竴鐩村汹镓扮潃鎴戏纴璇锋暀楂樻坠鍏充簬寰...

你这问题真有水平,我只能猜测你要问的 学德语首先要学语音,因为德语语音可以辅助记忆单词(德语单词就像拼音一样,每个字母有独特的发音,可以根据字母读出单词,也可以...


请注意,本站信息均收集自互联网,相关信息仅供参考,医疗等重要信息请以正规途径为最终意见,本站不承担任何责任!

www.wosoni.com false 互联网 http://www.wosoni.com/blogcnk/mm/ccdgdj.html report 5832 解决方案1:这样估计会搞理解一些:工具类中,static一般修饰的是方法,这个方法不依赖于自身变量,比如说,我们要做一个把大些字母全部变成小些字母的工具类,在这个构成中只有传参和返回值,静态在这里的作用可以理解为这个代码在程序中只有一份,如果这个时候有第二个调用过来,那就必须要第一个执行完。在这个过程中是不存在公共资源的赋值操作的。如果是修饰在成员变量上,那是静态变量,可以简单的理解成在程序运行时有一个公共的存储空间,如果在第一个请求过来时给这段空间赋值了A,在A还没有才做完的时候,第二个操作有赋值

热门图片