在java中static用来修饰Class类中属性和方法。java
被static修饰的成员属性和成员方法独立于该类的任何对象,它们在内存空间上会被放在描述Class的位置中,也就是说它们为此类(Class)全部的实例对象共用。安全
因此说只要这个类被加载,那么这些被static修饰的属性和方法都已经在JVM中存在了,所以,咱们能够经过类名直接调用这些属性和方法。多线程
那么我就想到了一个在多线程和并发的状况下,被static修饰的方法会不会出现不正确的数据处理呢?并发
下面写一段测试的代码ide
Porter.java测试
public class Porter { public static void test(int num){ System.out.printf("time : %s , num : %d \n",System.currentTimeMillis(),num); } }
Runner.javathis
public class Runner implements Runnable{ private int num; @Override public void run() { Porter.test(getNum()); } public void setNum(int num){ this.num = num; } public int getNum(){ return this.num; } public static void main(String args[]){ Thread th[] = new Thread[100]; for (int i = 0; i < th.length; i++) { Runner run =new Runner(); run.setNum(i); th[i] = new Thread(run); th[i].start(); } } }
在这个多线程程序中,run()方法一直都在调用Porter的一个static方法test()。实际程序输出以下:线程
time : 1423399741495 , num : 0 time : 1423399741521 , num : 40 time : 1423399741520 , num : 39 time : 1423399741520 , num : 38 time : 1423399741518 , num : 37 time : 1423399741518 , num : 36 time : 1423399741517 , num : 34 time : 1423399741517 , num : 35 time : 1423399741523 , num : 43 time : 1423399741516 , num : 32 time : 1423399741516 , num : 33 time : 1423399741516 , num : 30 time : 1423399741516 , num : 31 time : 1423399741515 , num : 29 time : 1423399741515 , num : 28 ……
虽然省略了一部分,可是程序确实没有执行错误,经过系统的时间戳发现,中间有几个线程确实也是同时执行的。这样说来被static修饰的方法并不存在并发的问题,那么这是为何呢?code
其实这就是变量的问题了,每次静态方法每次调用的内部变量,都是局部变量,每次调用静态方法时都会为它从新分配内存空间,因此是安全的。对象