synchronized在for循環內外的區別


上一次說到,synchronized鎖定普通方法靜態方法和鎖定代碼塊的this與class區別,

這一次說說synchronized在for循環內外的區別

synchronized在for循環的內部時:

@Override
public void run() {
for (int i = 0; i < 5; i++) {
synchronized (TestRunnable.class) {
System.out.println("線程:" + Thread.currentThread().getName() + "執行第" + i + "次");
}
}
}

輸出:

線程:線程一執行第0次
線程:線程二執行第0次
線程:線程二執行第1次
線程:線程二執行第2次
線程:線程二執行第3次
線程:線程二執行第4次
線程:線程一執行第1次
線程:線程一執行第2次
線程:線程一執行第3次
線程:線程一執行第4次

synchronized在for循環的外部時:

public void run() {
synchronized (TestRunnable.class) {
for (int i = 0; i < 5; i++) {
System.out.println("線程:" + Thread.currentThread().getName() + "執行第" + i + "次");
}
}
}

輸出:

線程:線程一執行第0次
線程:線程一執行第1次
線程:線程一執行第2次
線程:線程一執行第3次
線程:線程一執行第4次
線程:線程二執行第0次
線程:線程二執行第1次
線程:線程二執行第2次
線程:線程二執行第3次
線程:線程二執行第4次

結論:

同步符在外部時,執行結果必須是一個線程執行完了才能執行以下個,因為其他線程進不來。反之,一個線程就算進入了for循環,在循環若干次以后,可能會輪到其他的線程來執行,再回到初始線程時,依然能夠繼續執行之前的循環次數執行。(說了等於沒說,很簡單的結論,哈哈哈哈哈哈哈哈哈,記錄一下


免責聲明!

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



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