> 信息中心 >

基础问题关于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基础--static main()函数疑问

答:main()是MainTest的方法,这是最有营养的解释了,这叫自己访问自己,永远可以。 你现在的问题是不明白类结构,和各个修饰符的意义,建议看下public四种访问控制权限修饰符,static修饰符的用法和意义 了解了这些,才能学内部类,静态内部类,不...

java基础问题

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

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

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

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

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

Java初级疑问protected static int count = 0

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

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

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

java基础问题,求问哪里错了

答:你的er方法缺少返回语句,可以这样: public class quzuidazhi { public static void main(String[]args) { int [] yi= {1234567}; int s=er(yi); } public static int er(int[]yi) {return yi[0]; }}

java 基础问题!!!

答:package zhidao;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Scanner;public class PersonProject{public static void main ( String[] args ){Scanner scanner = new Scanner (System.in);Person[] people = ne...

java基础 帮帮忙

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

基础java 程序问题,恳请编程爱好者帮助,谢谢

答:import javax.swing.JOptionPane; public class DebutTest { //静态方法必须定义静态变量 static double PI= 3.14; static double area = 0.0; static double circumference=0.0; static double radius=2.0; public static void main(String[] a...

java 基础问题 static 高手进

都有默认值!如下: boolean false char byte 0 short 0 int 0 long 0 float 0.0 double 0.0 Object null 如果没设置值的话,就是默认值了! 但对于static类型的,由于它是在ma...

一个非常基础的有关static_cast的问题

展开全部 因为 x就是int,不论怎么转换,他也是int 百度百科 http://baike.baidu.com/view/1745207.htm?fr=ala0_1

static块是什么意思?

关于static静态变量我想楼主应该已经知道了,但是这个static语句块大家用得比较少,其实就是在对象生成之际产生一系列的static变量。 static语句块的内容有问题,看这个应该...

关于 final 修饰的成员变量问题 和 static{ } 代码块问题

普及下static的基础知识,依次回答如下: 1. static{ } 代码块的位置:可以放在类定义中的任何位置,但是它的执行是在类实例化之前。即你new Object()时,静态代码块是在构造函数...

关于java里static method的一个小问题

1:f()函数中的x跟主函数的x不是同一个东西。你调用f(x)只是把主函数x的值传了进去。f()函数的x值被修改了。但是他并没有修改主函数中x的值。如果你想修改主函数x的值。...

java中static作用详解

在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用... 接下来讲一下被static修饰后的变量的值的问题,刚才在前面讲过,被static修饰后的成员...

JAVA中 数组,静态内部类static,string的问题

static 可以 修饰 属性 方法 内部类 自由块 static 不能修饰局部变量 static用来修饰类的属性状态,他可以不产生对象就可以使用 static 的经典用法 单态设计模式 String 首先是类...

java 反射可以修改除基本类型以外的所有 static final 修饰的变量...

不能。 static final , 对于基本数据和对象,是不同的处理方式。 如果允许修改,将产生不可预知的问题。 所以不允许修改。 java.lang.IllegalAccessException

c语言中的static是什么

即使再次调用这个函数,这个static变量也不会再次被初始化,于是,这个变量的取值就会一直保存着,也就是说,当你再次调用这个函数的时候,里面用到这个static变量时,就会发现,还...


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

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

热门图片