關於i--與System.out.println()聯合使用時可能出現的異常情況

    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。

發佈了28 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章