2.1.2實(shí)例變量非線程安全

2.1.2實(shí)例變量非線程安全

如果多個(gè)線程共同訪問(wèn)1個(gè)對(duì)象中的實(shí)例變量,則有可能出現(xiàn)“非線程安全”問(wèn)題。

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class HasSelfPrivateNum {

    private int num=0;

    public void addI(String username){
        try {
            if (username.equals("a")) {
                num = 100;
                System.out.println("a set over!");
                Thread.sleep(200);
            }else{
                num=200;
                System.out.println("b set over!");
            }
            System.out.println(username+" num="+num);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadA extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadA(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("a");
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadB extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadB(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("b");
    }
}


/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
       HasSelfPrivateNum numRef=new HasSelfPrivateNum();
        ThreadA threadA=new ThreadA(numRef);
        threadA.start();

        ThreadB threadB=new ThreadB(numRef);
        threadB.start();
    }
}

程序運(yùn)行結(jié)果為:

a set over!
b set over!
b num=200
a num=200

本實(shí)驗(yàn)是兩個(gè)線程同時(shí)訪問(wèn)一個(gè)沒有同步的方法,如果兩個(gè)線程同時(shí)操作業(yè)務(wù)對(duì)象中的實(shí)例變量,則有可能會(huì)出現(xiàn)“非線程安全”問(wèn)題。修改HasSelfPrivateNum.java文件如下

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class HasSelfPrivateNum {

    private int num=0;

    synchronized public void addI(String username){
        try {
            if (username.equals("a")) {
                num = 100;
                System.out.println("a set over!");
                Thread.sleep(200);
            }else{
                num=200;
                System.out.println("b set over!");
            }
            System.out.println(username+" num="+num);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

重新運(yùn)行程序,運(yùn)行結(jié)果為:

a set over!
a num=100
b set over!
b num=200

摘選自 java多線程核心編程技術(shù)-2.1.2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,642評(píng)論 18 399
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,789評(píng)論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,539評(píng)論 19 139
  • 巨大的紅光點(diǎn)和鋼鐵穿出地面時(shí)發(fā)出的聲響宣告著它的到來(lái)。伊恩和波比相繼跳起,而我則還在發(fā)呆。 “世紀(jì)毀滅者都...
    紫云先生閱讀 935評(píng)論 1 2
  • 這個(gè)女孩17歲。 她坐在那里,有著17歲少女美麗的面龐,卻像80歲的老太太一樣,目光渙散,無(wú)所事事。 我笑她,像每...
    溺茗N閱讀 321評(píng)論 0 0

友情鏈接更多精彩內(nèi)容