java 線程安全問(wèn)題的解決辦法 和死鎖

線程安全問(wèn)題的解決辦法

線程 安全問(wèn)題的解決方案:sun提供了線程同步機(jī)制讓我們解決這類問(wèn)題的液南。

java線程同步機(jī)制的方式:
方式一:同步代碼塊

        同步代碼塊的格式:
            
            synchronized(鎖對(duì)象){
                需要被同步的代碼...
            }

同步代碼塊要注意事項(xiàng):
1. 任意的一個(gè)對(duì)象都可以做為鎖對(duì)象。
2. 在同步代碼塊中調(diào)用了sleep方法并不是釋放鎖對(duì)象的惑芭。
3. 只有真正存在線程安全問(wèn)題的時(shí)候才使用同步代碼塊涌萤,否則會(huì)降低效率的淹遵。
4. 多線程操作的鎖 對(duì)象必須 是唯一共享 的。否則無(wú)效负溪。

    class SaleTicket extends Thread{
 static int num = 50;//票數(shù)  非靜態(tài)的成員變量,非靜態(tài)的成員變量數(shù)據(jù)是在每個(gè)對(duì)象中都會(huì)維護(hù)一份數(shù)據(jù)的透揣。
 
 static Object o = new Object();

 public SaleTicket(String name) {
    super(name);
}

@Override
public void run() {
    while(true){
        //同步代碼塊
        synchronized ("鎖") {//任意的一個(gè)對(duì)象都可以做為鎖對(duì)象。對(duì)象為Static川抡,但String特殊淌实,因?yàn)樽址褪窃谧址A砍刂小?             
            if(num>0){
                System.out.println(Thread.currentThread().getName()+"售出了第"+num+"號(hào)票");
                try {
                    Thread.sleep(100);//在同步代碼塊中調(diào)用了sleep方法并不是釋放鎖對(duì)象的。
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                num--;
            }else{
                System.out.println("售罄了..");
                break;
            }
        }
        
    }
}   


} 


public class Thread_02 {

public static void main(String[] args) {
    String s =new String("abc");
    String str1 = "abc"; 
    System.out.println(str1 ==s);
    //創(chuàng)建三個(gè)線程對(duì)象猖腕,模擬三個(gè)窗口
    SaleTicket thread1 = new SaleTicket("窗口1");
    SaleTicket thread2 = new SaleTicket("窗口2");
    SaleTicket thread3 = new SaleTicket("窗口3");
    //開(kāi)啟線程售票
    thread1.start();
    thread2.start();
    thread3.start();
    
}

  }

方式二:同步函數(shù)
同步函數(shù)就是使用synchronized修飾一個(gè)函數(shù)。

同步函數(shù)要注意的事項(xiàng) :
    1. 如果是一個(gè)非靜態(tài)的同步函數(shù)的鎖 對(duì)象是this對(duì)象(ps:這樣會(huì)存在鎖不住的情況恨闪,因?yàn)閭z個(gè)對(duì)象調(diào)用同一個(gè)文件倘感,就會(huì)出現(xiàn)倆個(gè)鎖),如果是靜態(tài)的同步函數(shù)的鎖 對(duì)象是當(dāng)前函數(shù)所屬的類的字節(jié)碼文件(class對(duì)象)咙咽。
    2. 同步函數(shù)的鎖對(duì)象是固定的老玛,不能由你來(lái)指定 的。


推薦使用: 同步代碼塊钧敞。
    原因:
        1. 同步代碼塊的鎖對(duì)象可以由我們隨意指定蜡豹,方便控制。同步函數(shù)的鎖對(duì)象是固定 的溉苛,不能由我們來(lái)指定镜廉。
        2. 同步代碼塊可以很方便控制需要被同步代碼的范圍,同步函數(shù)必須是整個(gè)函數(shù) 的所有代碼都被同步了愚战。
class BankThread extends Thread{

static  int count = 5000;

public BankThread(String name){
    super(name);
}

@Override  //
public void run() {
    getMoney();//這樣也鎖定住娇唯,但是會(huì)造成只能一個(gè)人取完全部的錢齐遵,因?yàn)橹挥醒h(huán)結(jié)束,才會(huì)釋放鎖
}   


//靜態(tài)的函數(shù)---->函數(shù)所屬 的類的字節(jié)碼文件對(duì)象--->BankThread.class  唯一的塔插。
public static synchronized  void getMoney(){
    while(true){            
            if(count>0){
                System.out.println(Thread.currentThread().getName()+"取走了1000塊,還剩余"+(count-1000)+"元");
                count= count - 1000;
            }else{
                System.out.println("取光了...");
                break;
            }
        
    }
}

 }


  public class Demo1 {

public static void main(String[] args) {
    //創(chuàng)建兩個(gè)線程對(duì)象
    BankThread thread1 = new BankThread("老公");
    BankThread thread2 = new BankThread("老婆");
    //調(diào)用start方法開(kāi)啟線程取錢
    thread1.start();
    thread2.start();
    
    
}

}       

出現(xiàn)線程安全問(wèn)題的根本原因:
1. 存在兩個(gè)或者兩個(gè)以上 的線程對(duì)象,而且線程之間共享著一個(gè)資源梗摇。
2. 有多個(gè)語(yǔ)句操作了共享資源。

線程的死鎖

/*
 * java 中同步機(jī)制解決了線程安全問(wèn)題想许,但是同時(shí)引發(fā)死鎖現(xiàn)象
 * 
 * 死鎖現(xiàn)象:就是 倆個(gè)或者倆個(gè)以上線程伶授,共同調(diào)用倆個(gè)或者以上的資源,發(fā)生共同等待的狀態(tài)
 * 
 * 死鎖現(xiàn)象的出現(xiàn)的根本原因:
 * 1.存在倆個(gè)或者倆個(gè)以上的線程
 * 2.存在倆個(gè)或者倆個(gè)以上的共享資源
 * 
 * 死鎖現(xiàn)象的解決方案:沒(méi)有方案流纹,只能盡量避免發(fā)生而已

*/

class DeadLock extends Thread{
    public DeadLock(String name){
        super(name);
    }

    public void run(){
        if("張三".equals(Thread.currentThread().getName())){
            synchronized ("遙控器") {
                System.out.println("張三拿到了遙控器糜烹,準(zhǔn)備去拿電池!捧颅!");
                synchronized ("電池") {
                    System.out.println("張三拿到了遙控器和電池景图,開(kāi)始吹空調(diào)");
                }
            }
        
        }else if("李四".equals(this.getName())){
            synchronized ("電池") {
                System.out.println("李四拿到了電池,準(zhǔn)備去那遙控器");
                synchronized ("遙控器") {
                    System.out.println("李四拿到了遙控器和電池碉哑,開(kāi)始吹空調(diào)");
                }
            }
        
        }
    }
}
public class Thread_04 {
    public static void main(String[] args) {
            DeadLock l1=new DeadLock("張三");
        DeadLock l2=new DeadLock("李四");
        l1.start();
        l2.start();
}

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挚币,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扣典,更是在濱河造成了極大的恐慌妆毕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮尖,死亡現(xiàn)場(chǎng)離奇詭異笛粘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)湿硝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門薪前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人关斜,你說(shuō)我怎么就攤上這事示括。” “怎么了痢畜?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵垛膝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丁稀,道長(zhǎng)吼拥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任线衫,我火速辦了婚禮凿可,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桶雀。我一直安慰自己矿酵,他們只是感情好唬复,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著全肮,像睡著了一般敞咧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辜腺,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天休建,我揣著相機(jī)與錄音,去河邊找鬼评疗。 笑死测砂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的百匆。 我是一名探鬼主播砌些,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼加匈!你這毒婦竟也來(lái)了存璃?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雕拼,失蹤者是張志新(化名)和其女友劉穎纵东,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體啥寇,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偎球,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辑甜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衰絮。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖磷醋,靈堂內(nèi)的尸體忽然破棺而出岂傲,到底是詐尸還是另有隱情,我是刑警寧澤子檀,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站乃戈,受9級(jí)特大地震影響褂痰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜症虑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一缩歪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谍憔,春花似錦匪蝙、人聲如沸主籍。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)千元。三九已至,卻和暖如春颤绕,著一層夾襖步出監(jiān)牢的瞬間幸海,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工奥务, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留物独,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓氯葬,卻偏偏與公主長(zhǎng)得像挡篓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帚称,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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