12童擎、synchronized同步方法+同步/異步

1、多線程編程方式

  1. 創(chuàng)建資源類
  • 創(chuàng)建資源類
  • 資源類里創(chuàng)建同步方法苏章、同步代碼塊
  1. 高內(nèi)聚低耦合

2寂嘉、為什么需要Synchronized?

編寫一個基本的多線程操作例子

/**
 * 給成員變量賦值操作
 * 資源類
 */
public class Task {

    //成員變量存儲在堆內(nèi)存里面枫绅,多個線程訪問同一個堆內(nèi)存泉孩,
    //即多個線程可以同時修改num的值,這樣會導(dǎo)致線程安全問題
    private int num=0;

    public void changeNum(boolean flag){
        if(flag){
            num = 88;
            System.out.println(Thread.currentThread().getName() + "=====" + "begin");
            System.out.println(Thread.currentThread().getName() + "=====" + num);
            System.out.println(Thread.currentThread().getName() + "=====" + "over");
        }else{
            num = 66;
            System.out.println(Thread.currentThread().getName() + "=====" + "begin");
            System.out.println(Thread.currentThread().getName() + "=====" + num);
            System.out.println(Thread.currentThread().getName() + "=====" + "over");
        }
    }
}

public class SynchronizedTest01 {

    public static void main(String[] args) {
        //多個線程控制一個對象(一個資源類)
        Task task = new Task();

        Thread t1 = new Thread(){
            public void run(){
                task.changeNum(true);
            }
        };

        Thread t2 = new Thread(){
            public void run(){
                task.changeNum(false);
            }
        };
        t1.start();
        t2.start();
    }
}
結(jié)果:
Thread-1=====begin
Thread-0=====begin
Thread-1=====66
Thread-0=====66
Thread-1=====over
Thread-0=====over

分析:
可以發(fā)現(xiàn)數(shù)據(jù)跟我們所想的并不一致并淋,兩個線程都打印出num等于66寓搬,這就出現(xiàn)了線程安全的問題,出現(xiàn)這個問題的原因是成員變量存儲在堆內(nèi)存中县耽,兩個線程共享堆內(nèi)存句喷,即兩個線程可以對同一個num進行修改曼尊,如果num定義在方法中,那么就存在棧中脏嚷,線程各自就會在棧中對其修改,則不會出現(xiàn)線程不安全的問題瞒御。

程序執(zhí)行分析:
cpu執(zhí)行t1線程父叙,將num修改為88,之后cpu開始執(zhí)行t2線程肴裙,將num修改為66趾唱,打印出66,cpu開始執(zhí)行t1線程蜻懦,打印num的值甜癞,此時num的值是66。

內(nèi)存圖解:


image.png

3宛乃、同步和異步

比如你要給A,B,C三人發(fā)消息
同步:先給A發(fā)悠咱,等A回復(fù)后,再給B發(fā)征炼,等B回復(fù)后析既,再給C發(fā),排隊等待
異步:直接給A,B,C發(fā)消息谆奥,中間不需要等某人回復(fù)之后再給其他人發(fā)消息眼坏,不用排隊等待

要想解決上述線程不安全的問題,可以將方法定義為同步方法

public synchronized void changeNum(boolean flag)

在方法上加入synchronized關(guān)鍵字酸些,這樣在執(zhí)行多個線程時看哪個線程先執(zhí)行這個方法宰译,假設(shè)有t1,t2魄懂,t3三個線程中都調(diào)用了changeNum方法沿侈,t1線程先執(zhí)行了這個方法,那么t1會先在Task對象上面加鎖市栗,加鎖后肋坚,別的線程就無法執(zhí)行當(dāng)前Task對象上的changeNum方法,直到t1執(zhí)行結(jié)束changeNum方法之后肃廓,t2,t3中的一個線程才可以執(zhí)行這個方法智厌,這就保證了在某個時間段內(nèi)只有一個線程執(zhí)行changeNum方法,解決了線程安全問題盲赊。

注意:synchronized鎖住的是當(dāng)前對象铣鹏,如果t1線程和t2線程里面是不同的對象,則不需要同步哀蘑,因為不會發(fā)生線程安全問題诚卸。如下代碼:

public class SynchronizedTest01 {

    public static void main(String[] args) {
        //創(chuàng)建兩個Task對象
        Task task1 = new Task();
        Task task2 = new Task();

        //兩個線程t1和t2使用的是不同的Task對象葵第,不會發(fā)生線程安全問題
        Thread t1 = new Thread(){
            public void run(){
                task1.changeNum(true);
            }
        };

        Thread t2 = new Thread(){
            public void run(){
                task2.changeNum(false);
            }
        };

        t1.start();
        t2.start();
    }

}
//此時并不會出現(xiàn)線程不安全的問題,每個線程執(zhí)行各自的資源類合溺,并不會出現(xiàn)線程不安全的問題
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卒密,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棠赛,更是在濱河造成了極大的恐慌哮奇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睛约,死亡現(xiàn)場離奇詭異鼎俘,居然都是意外死亡,警方通過查閱死者的電腦和手機辩涝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門贸伐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怔揩,你說我怎么就攤上這事捉邢。” “怎么了商膊?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵歌逢,是天一觀的道長。 經(jīng)常有香客問我翘狱,道長秘案,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任潦匈,我火速辦了婚禮阱高,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茬缩。我一直安慰自己赤惊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布凰锡。 她就那樣靜靜地躺著未舟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掂为。 梳的紋絲不亂的頭發(fā)上裕膀,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音勇哗,去河邊找鬼昼扛。 笑死,一個胖子當(dāng)著我的面吹牛欲诺,可吹牛的內(nèi)容都是我干的抄谐。 我是一名探鬼主播渺鹦,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛹含!你這毒婦竟也來了毅厚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浦箱,失蹤者是張志新(化名)和其女友劉穎吸耿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憎茂,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年锤岸,在試婚紗的時候發(fā)現(xiàn)自己被綠了竖幔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡是偷,死狀恐怖拳氢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛋铆,我是刑警寧澤馋评,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站刺啦,受9級特大地震影響留特,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玛瘸,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一蜕青、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糊渊,春花似錦右核、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宗兼,卻和暖如春躏鱼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殷绍。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工挠他, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篡帕。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓殖侵,卻偏偏與公主長得像贸呢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拢军,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容