> 信息中心 >

基础问题关于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修饰的类成员属性就是属于类而不是属于对象,所以不会存才线程安全的问题的。
解决方案5:
感谢大家的回复,其实这是一个我自己忽略掉的非常基础的一个知识。有关于static所修饰的字段、方法的特征没有清晰。静态变量不是线程安全的,而静态方法并不会导致线程不安全。对于字段而言,储存的是一个实际的值或者内存地址,所以当内容变更时会导致连锁反应。

java基础问题

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

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

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

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

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

Java初级疑问protected static int count = 0

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

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

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

关于java的基础问题

答:public static void main (String args[]) 是 主调函数 static 修饰变量的用法你知道了 static 还能修饰方法, 你再去看看. 这个表示这个方法 在全局只声明一次 你可以顺便看看 单例模式

问些关于java的基础问题,勿拍砖

答:Q1:API是应用程序接口,是告诉你如何用的,而是不是底层代码如何写的。可以下载JAVA源码研究。 Q2:不多,应该问的,这样才严谨。java基础知识很多是固定的,但应用千变万化。所以要吃透,才能才能应变。 希望采纳。 例如源码中System类(改了...

JAVA基础知识求解答

答:访问static变量,不需要从对象中访问,可以直接使用 类名.变量名 访问; 没有加static的变量,需要先创建对象 ,在该例子中就是这样访问的: StaticTest st = new StaticTest(); //打印st对象的y值 System.out.println(st.y); StaticTest.y=Stat...

java基础 帮帮忙

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

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

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


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

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

热门图片