println()方法與i--聯合使用時“有可能”出現異常,雖然println()方法在內部是同步的,但i--的操作卻是在進入println()之前發生的,所以有發生非線程安全問題的概率,如圖 1-4所示。
圖 1-4 println內部同步
示例代碼如下:
package com.vhqimk.thread;
/*
* 測試i--與println()聯合使用時可能出現異常
*/
public class Test {
public static void main(String[] args) {
// 創建一個MyThread對象,並將該對象分別加載到五個線程中並分別給線程命名
MyThread myThread = new MyThread();
Thread t1 = new Thread(myThread);
Thread t2 = new Thread(myThread);
Thread t3 = new Thread(myThread);
Thread t4 = new Thread(myThread);
Thread t5 = new Thread(myThread);
// 啓動五個線程
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
class MyThread extends Thread {
private int i = 5;
public void run() {
System.out.println("i=" + (i--) + " threadName=" + Thread.currentThread().getName());
}
}
運行結果可能出現異常如圖 1-5所示
圖 1-5 出現非線程安全問題
所以,爲了防止發生非線程安全問題還應使用同步方法,即在run()方法前最前面加上synchronized,加上之後運行結果如圖 1-6所示
圖 1-6 沒有非線程安全問題
**總結:**println()與i–聯合使用時可能會出現非線程安全問題,解決方法仍是使用同步方法,即在需要同步的方法前加上關鍵字synchronized。