java中什么是線程安全給出一個(gè)例子

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



例:1.8.1-本章源碼

class Photoshop {
    private Photoshop() {
    }
    private static Photoshop photoshop = null;// 這個(gè)值獨(dú)立于任何對(duì)象存在,實(shí)例化任何對(duì)象之前,這個(gè)成員就有可能有值。
    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

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




例: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() + "實(shí)例是 "
                + 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í)是(占少數(shù)):
Thread-1實(shí)例是 Photoshop@1270b73
Thread-0實(shí)例是 Photoshop@89ae9e


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


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