java中什么是線程安全給出一個例子

什么是線程安全? 馬克-to-win: 最大的大白話,你的代碼一個線程執(zhí)行挺好,一上多線程測試就玩兒完(結(jié)果不是你所想要的),這就是線程不安全。反之為線程安全。首先,我們把第二章講單態(tài)模式或單例模式(Singleton)的例子再搬過來一次,但這里把一些無關(guān)的打印和注釋去掉了:
 馬克- to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。



例:1.8.1-本章源碼

class Photoshop {
    private Photoshop() {
    }
    private static Photoshop photoshop = null;// 這個值獨立于任何對象存在,實例化任何對象之前,這個成員就有可能有值。
    public static Photoshop getInstanceQixy() {
        if (photoshop == null) {
            photoshop = new Photoshop();
        }
        return photoshop;
    }
}
public class Test {
    public static void main(String[] args) {
        Photoshop photoshopI1 = Photoshop.getInstanceQixy();
        Photoshop photoshopI2 = Photoshop.getInstanceQixy();
        System.out.println(photoshopI1+"  "+photoshopI2);
    }
}
輸出結(jié)果:
Photoshop@1b67f74  Photoshop@1b67f74

后序:上面的例子一切都正常,就是一個非常普通的單態(tài)模式的實現(xiàn)。但要想上面的例子正確運行,我們必須確保運行環(huán)境是單線程的。如果運行環(huán)境是多線程的,以上的單態(tài)模式的實現(xiàn),就有一定的機率,運行得不到正確的結(jié)果了。以下我用實驗(下面的例子)來說明我這一論點。




例:1.8.1_b-本章源碼

class Photoshop {
    private Photoshop() {
    }
    private static Photoshop photoshop = null;
    public static Photoshop getInstanceQixy() {
        if (photoshop == null) {
            photoshop = new Photoshop();
        }
        return photoshop;
    }
}
class MyThreadMark_to_win extends Thread {
    public void run() {
        Photoshop photoshopI1 = Photoshop.getInstanceQixy();
        System.out.println(Thread.currentThread().getName() + "實例是 "
                + photoshopI1);
    }
}
public class Test {
    public static void main(String[] args) {
        MyThreadMark_to_win mt1 = new MyThreadMark_to_win();
        MyThreadMark_to_win mt2 = new MyThreadMark_to_win();
        mt1.start();
        mt2.start();
    }
}
輸出結(jié)果有時是(占少數(shù)):
Thread-1實例是 Photoshop@1270b73
Thread-0實例是 Photoshop@89ae9e


而輸出結(jié)果多數(shù)是:(占多數(shù))
Thread-0實例是 Photoshop@a62fc3
Thread-1實例是 Photoshop@a62fc3


后序:因為兩個線程同時啟動,如果一個線程執(zhí)行完photoshop = new Photoshop();以后,另外一個線程執(zhí)行if (photoshop == null)判斷,則只會得到一個photoshop實例。然而對于得到了兩個photoshop實例結(jié)果的這種情況,一定是這兩個線程同時執(zhí)行if (photoshop == null)這句指令造成的。而線程的執(zhí)行順序和速度是我們?nèi)藶椴豢煽氐?。這就是程序得到以上兩種結(jié)果的原因。既然你的目的是編一個單例的程序,單線程時結(jié)果正確,而在多線程執(zhí)行環(huán)境時,結(jié)果得到了兩個實例,(結(jié)果非預(yù)期),這種情況就說,我們編的代碼Photoshop類是線程不安全的。馬克-to- win:如果你確定你的代碼不會在多線程的環(huán)境下執(zhí)行,線程不安全的代碼也沒關(guān)系,因為通常情況下解決線程不安全要用synchronized,會影響性能。如果你確定你的代碼不會。。。。。更多內(nèi)容,進入: