上一次說到,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循環,在循環若干次以后,可能會輪到其他的線程來執行,再回到初始線程時,依然能夠繼續執行之前的循環次數執行。(說了等於沒說,很簡單的結論,哈哈哈哈哈哈哈哈哈,記錄一下