在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
其實這就是變量的問題了,每次靜態方法每次調用的內部變量,都是局部變量,每次調用靜態方法時都會爲它從新分配內存空間,因此是安全的。對象