16 同一把鎖

2022-10-10 17:39:12 字數 2592 閱讀 7077

同一把鎖

本節給大家演示一下,多個執行緒爭奪同一把鎖和不同鎖的場景。

首先自定義乙個任務,任務內容就是兩個執行緒分別去執行兩個不同的同步**塊,如何做到這一點?我們可以定義乙個boolean型別的標記,然後通過標記來切換不同執行緒去執行不同的**塊。所以這裡我們還要定義乙個更改標記的方法用於切換標記,接著在run方法中判斷標記,先來編寫if語句,也就是當標記為處時,在裡面寫上同步大模組,同步鎖為task.class,同步內容就是使當前執行緒休眠三秒鐘,目的是拿著鎖三秒鐘不放,看看另乙個爭奪鎖的執行緒會不會等待,睡醒以後列印當前執行緒名稱加睡醒了。

接下來編寫else一句,也就是當標記為false時,寫上同步所也為task.class的同步**塊,同步內容就是輸出當前執行緒名稱和一句話。

下面我們來執行這個任務,首先將任務建立出來,然後建立兩個執行緒,讓他們去爭奪同一把鎖,接著將任務分別傳遞給他們。這裡我們先啟動thread1,待會再啟動thread2,因為在啟動thread2之前,需要切換一次標記,達到不同執行緒執行不同**塊的目的。我們讓主線程休眠一秒鐘一秒鐘之後去切換這個標記,使用try---catch捕獲sleep方法丟擲的異常。 

接著設定標記為false,因為標記的處時值為true,所以切換過後就是false。最後啟動thread2。下面來看看執行結果,

這裡說明一下結果中的thread0就是thread1物件,所謂的thread1就是所謂的thread2物件,因為執行緒取名都是從0開始的。好了,從執行結果來看,兩個執行緒的確是在爭奪同1把所, thread1拿著鎖休眠了三秒鐘,thread2在thread1睡醒之後輸出內容。這就說明thread1拿著鎖休眠的時候,thread2被阻塞了。他在等thread1釋放鎖。同時也說明,當執行緒拿著鎖休眠時,是不會釋放鎖的。 

以上就是同一把所的情況。下面我們再來看看不同鎖的情況,修改任務**,將else語句中的同步鎖換成main.class,看看執行結果會怎麼樣。

從執行結果來看,thread2還沒等thread1睡醒就已經列印了內容,整個程式是在thread1睡醒之後結束的,這就說明不同鎖線程之間是不會相互爭奪的,所以也就不會阻塞。

最後我們來總結一下本節的內容,本節演示了多個執行緒爭奪同一把鎖和不同鎖的情況,發現爭奪同一把鎖時執行緒會阻塞,爭奪不同鎖時,執行緒不會阻塞。 

附錄:筆記完整文字:

本節給大家演示一下多個執行緒爭奪同位話所和不同所的場景。首先制定乙個任務,任務內容就是兩個執行緒分別去執行兩個不同的同步大模組,如何做到這一點?我們可以定義乙個bore型別的標記,然後通過標記來切換不同執行緒去執行不同的**塊。所以這裡我們還要定義乙個更改標記的方法用於切換標記,接著在run方法中判斷標記,先來編寫if語句,也就是當標記為處時,在裡面寫上同步大模組,同所謂task、點、class,同步內容就是使當前執行緒休眠三秒鐘,目的是拿著鎖三秒鐘不放,看看另乙個爭奪所的先生會不會等待,睡醒以後列印當前執行緒名稱加睡醒了。 接下來編寫else一句,也就是當標記為false時,寫上同步所也為task點class的同步大板塊,同步內容就是輸出當前執行緒名稱和一句話。下面我們來執行這個任務,首先將任務建立出來,然後建立兩個執行緒,讓他們去爭奪同一把鎖,接著將任務分別傳遞給他們。這裡我們先啟動swear的一,待會再啟動straight的二,因為在啟動three的二之前,需要切換一次標記,達到不同執行緒執行不同**塊的目的。我們讓主線程休眠一秒鐘一秒鐘之後去切換這個標記,使用tretite捕獲sleep方法丟擲的異常。 接著設定標記為forth,因為標記的處時值為true,所以切換過後就是false。最後啟動swear的二。下面來看看執行結果,這裡說明一下結果中的three的-0就是three的一物件,所謂的-1就是所謂的二物件,因為執行緒取名都是從0開始的。好了,從執行結果來看,兩個縣城的確是在爭奪同18所 three的一拿著鎖休眠了三秒鐘thra的二在thread一睡醒之後輸出內容。這就說明斯瑞的一拿著鎖休眠的時候,siri的二被阻塞了。他在等子瑞的一釋放組同時也說明,當縣城拿著鎖休眠時是不會釋放鎖的。 以上就是同一把所的情況。下面我們再來看看不同所的情況,修改任務**,將ears與劇中的同步所換成慢點class,看看執行結果會怎麼樣。從執行結果來看,three的二還沒等,three的一睡醒就已經列印了內容,整個程式是在three的e睡醒之後結束的,這就說明不同所縣城之間是不會相互爭奪的,所以也就不會阻塞。最後我們來總結一下本節的內容,本節演示了多個縣城爭奪同一把鎖和不同所的情況,發現爭奪同一把鎖時縣城會阻塞,爭奪不同所時,縣城不會阻塞。

監視鎖 Lock 限制執行緒個數的一把鎖

為什麼要用鎖?在多執行緒中,尤其是靜態資源的訪問,必然會有競爭 private static int nums 0 private static object mylock new object static void method12 static void testmethod lock是mon...

一把一把撈大資料 釋放無限價值

電商平台對於傳統經濟是個怎樣的存在?是阻礙還是發展,全看你如何選擇。面對新環境還依然按照傳統模式發展必然會受到阻礙,經濟就是要在新的環境下適應新的發展,只故步自封不會有大發展。一把一把撈讓電子商務與大資料技術進一步融合,釋放無限價值。電商平台對於傳統經濟是個怎樣的存在?是阻礙還是發展,全看你如何選擇...

一把鼻涕一把淚 搭建公網ftp伺服器

至於為什麼要搭建公網ftp伺服器,就當我心血來潮吧。ftp開源工具很多,咱用的是filezilla伺服器。後來為了方便搭建web伺服器,就改成了整合工具xampp。客戶端工具也是filezilla client,用瀏覽器也行。首先內網使用者想搭建公網ftp伺服器第乙個要解決的問題是如何得到公網ip。...