Static方法在多線程環境下的運行


最近看了Jfinal 一致對model的那個static final dao有些疑惑,全局一個實例安全嗎?同時也出了一個疑惑,靜態方法執行會有並發影響嗎?看代碼

StaticThread.java

public class StaticThread implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        StaticAction.print();
    }

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            new Thread(new StaticThread()).start();
        }
    }
}

StaticAction.java

public class StaticAction {

public static void print() { int sum = 0; for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+ " step " + i + " is running."); sum += i; } System.out.println("sum is " + sum); } }

執行結果如下,可以猜猜:1.sum是多少?2.執行過程是什么樣子的?

Thread-0 step 0 is running.
Thread-1 step 0 is running.
Thread-1 step 1 is running.
Thread-1 step 2 is running.
Thread-1 step 3 is running.
Thread-0 step 1 is running.
Thread-1 step 4 is running.
Thread-0 step 2 is running.
Thread-1 step 5 is running.
Thread-0 step 3 is running.
Thread-0 step 4 is running.
Thread-0 step 5 is running.
Thread-0 step 6 is running.
Thread-0 step 7 is running.
Thread-0 step 8 is running.
Thread-0 step 9 is running.
sum is 45
Thread-1 step 6 is running.
Thread-1 step 7 is running.
Thread-1 step 8 is running.
Thread-1 step 9 is running.
sum is 45
View Code

 

看過結果之后,你會發現靜態方法執行過程是隨着線程的切換而交叉執行的【一會執行下Thread1 一會執行下Thread0】,但是每個線程的執行都有自己的執行環境【for 循環每一步都不會缺失(因為發生交叉覆蓋導致循環混亂),最終sum結果都是45】,因此事隔離的。所以,隨着的線程的切換,靜態方法的參數環境也會發生變化(jvm計數器會記錄當前線程上一次執行的位置(執行到哪個方法哪一行)),所以只要不是涉及共享變量,就不會出現並發問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM