java初入多線程7

同步控制

  1. synchronized 擴展:重入鎖
  • 重入鎖來代替synchronized充岛,在Jdk1.6以后 synchronized的性能與重入鎖性能差不多。
  • 重入鎖的實現(xiàn)
public static ReentrantLock lookLock= new ReentrantLock();
    
    public static int i=0;
    
    public void run() {
        
        for(int j=0; j<100000;j++) {
            lookLock.lock();  //加鎖
            lookLock.lock();
            try {
                i++;
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lookLock.unlock();
                lookLock.unlock();
            }
        }
    }

    
    public static void main(String[] args) throws InterruptedException {
        ReenterLock  reenterLock=new ReenterLock();
        Thread t1=new Thread(reenterLock);
        Thread t2=new Thread(reenterLock);
        
        t1.start(); t2.start();
        t1.join();t2.join();
        System.out.println(i);
    
    }
  • 在上述代碼中我們使用了重入鎖來保護臨界區(qū)資源i,確保程序的操作的安全性耕蝉。我們在使用重入鎖的時候需要顯示的指定何時加鎖崔梗,何時釋放鎖。必須釋放鎖不然其他線程沒有機會訪問臨界區(qū)了垒在。
  • 我們在代碼上還實現(xiàn)了多次加鎖的控制蒜魄,同一個線程可以加入多個鎖來控制 ,但是釋放的時候加了 幾個鎖就要釋放幾個鎖场躯。不然其他線程也無法進入臨界區(qū)谈为。

中斷響應

  1. 我們在使用synchronized 來加鎖的話,那么結果只有兩種可能 一是獲得鎖繼續(xù)執(zhí)行踢关。二是 繼續(xù)等待伞鲫。但是我們使用重入鎖就可以使其中斷。
  2. 鎖申請等待限時
  • 除了我們在等待外部通知之外签舞,避免死鎖還有另外一種方法秕脓。就是限時等待。我們可以給定一個等待的時候后儒搭。如果線程很長時間拿不到鎖吠架,等待時間到了那么讓其自動放棄。

我們使用重入鎖的tryLock()方法接受兩個參數(shù)搂鲫,一個表示等待時長诵肛,另外一個表示計時單位。并且 該方法也可以不帶參數(shù)直接運行默穴,在嘗試的時候能獲得到鎖,就會立即返回褪秀,當鎖被其他線程占用的時候當前線程不會進行等待蓄诽,立即返回false. 不會產生等待。因此不會產生死鎖媒吗。代碼如下

public class TryLock implements Runnable {

    public static ReentrantLock  lock1 =new ReentrantLock();
    public static ReentrantLock  lock2 =new ReentrantLock();
    int lock;
    
    public TryLock(int lock) {
        this.lock=lock;
    }
    
    public void run() {
        
        if(lock==1) {
            while(true) {
                if(lock1.tryLock()) {
                     try {
                        try {
                            Thread.sleep(500);
                        } catch (Exception e) {
                            
                        }
                        if(lock2.tryLock()) {
                            try {
                                System.out.println(Thread.currentThread().getId() +":My Job done");
                                return ;
                            } finally {
                                lock2.unlock();
                            }
                        }
                        
                    } finally {
                        lock1.unlock();
                    }
                }
            }
        }
        else {
            while(true) {
                if(lock2.tryLock()) {   
                try {
                    try {
                        Thread.sleep(500);
                    } catch (Exception e) {
                    }
                    
                    if(lock1.tryLock()) {
                        try {
                            System.out.println(Thread.currentThread().getId() +"My Job done");
                            return ;
                        } finally {
                            lock1.unlock();
                        }
                    }
                }   finally {
                    lock2.unlock();
                }
                }
            }
        }

    }   
    
    public static void main(String[] args) {
        TryLock r1=new TryLock(1);
        TryLock r2=new TryLock(2);
        Thread t1 =new Thread(r1);
        Thread t2 =new Thread(r2);
        t1.start();
        t2.start();
        
    }
        
}
死鎖產生了結果
  1. 公平鎖
  • 大多數(shù)情況下仑氛,鎖的申請都是非公平的。如果我們使用的是synchronized 來加鎖闸英,產生的鎖就是非公平的锯岖。但是我們可以使用重入鎖允許我們對其公平性進行設置。 方法為ReentrantLock(boolean fair)甫何; 當 fair 為true 時出吹,代表鎖是公平的,但是使用公平鎖 需要維護一個有序的隊列辙喂,就會造成性能降低捶牢。因此我們在默認情況下不使用公平鎖鸠珠。
  • 整理ReentrantLock 的幾個方法如下:
  • lock():獲得鎖 ,吐過鎖被占用 秋麸,則等待渐排;
  • lockInterruptibly(): 獲得鎖,單會優(yōu)先響應中斷灸蟆;
  • tryLock(); 嘗試獲得鎖驯耻,成功返回true,失敗返回false;不等待立即返回炒考。
  • tryLock(long time,TimeUnit unit): 給定時間內獲得鎖可缚。
  • unlock(); 釋放鎖。

在重入鎖實現(xiàn)中 主要包含三個元素:

  • 使用原子狀態(tài)票腰,原子操作使用CAS操作來存儲當前鎖的狀態(tài)城看,判斷鎖是否被別的線程持有。
  • 等待隊列杏慰。所有沒有請求到鎖的線程测柠,會被放入等待隊列中進行等待,待有線程釋放后 系統(tǒng)就能從隊列中喚醒一個線程缘滥,繼續(xù)工作轰胁。
  • 阻塞park()和unpark,用來掛起和恢復線程朝扼。沒有得到鎖的線程將會被掛起赃阀。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市擎颖,隨后出現(xiàn)的幾起案子榛斯,更是在濱河造成了極大的恐慌,老刑警劉巖搂捧,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驮俗,死亡現(xiàn)場離奇詭異,居然都是意外死亡允跑,警方通過查閱死者的電腦和手機王凑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聋丝,“玉大人索烹,你說我怎么就攤上這事∪跄溃” “怎么了百姓?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長况木。 經常有香客問我瓣戚,道長端圈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任子库,我火速辦了婚禮舱权,結果婚禮上,老公的妹妹穿的比我還像新娘仑嗅。我一直安慰自己宴倍,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布仓技。 她就那樣靜靜地躺著鸵贬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脖捻。 梳的紋絲不亂的頭發(fā)上阔逼,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音地沮,去河邊找鬼嗜浮。 笑死,一個胖子當著我的面吹牛摩疑,可吹牛的內容都是我干的危融。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雷袋,長吁一口氣:“原來是場噩夢啊……” “哼吉殃!你這毒婦竟也來了?” 一聲冷哼從身側響起楷怒,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蛋勺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸠删,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫卢,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年冶共,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每界。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡捅僵,死狀恐怖,靈堂內的尸體忽然破棺而出眨层,到底是詐尸還是另有隱情庙楚,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布趴樱,位于F島的核電站馒闷,受9級特大地震影響酪捡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜纳账,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一逛薇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疏虫,春花似錦永罚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翅敌,卻和暖如春羞福,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚯涮。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工治专, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恋昼。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓看靠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親液肌。 傳聞我的和親對象是個殘疾皇子挟炬,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容