大白話說說synchronized關鍵詞的三種用法

2021-10-04 10:56:56 字數 1085 閱讀 3311

synchronized關鍵字的作用域有二種:

某個物件例項內,synchronized amethod(){}可以防止多個執行緒同時訪問這個物件的synchronized方法(如果乙個物件有多個synchronized方法,只要乙個線 程訪問了其中的乙個synchronized方法,其它執行緒不能同時訪問這個物件中任何乙個synchronized方法)。這時,不同的物件例項的 synchronized方法是不相干擾的。也就是說,其它執行緒照樣可以同時訪問相同類的另乙個物件例項中的synchronized方法;

某個類的範圍,synchronized static astaticmethod{}防止多個執行緒同時訪問這個類中的synchronized static 方法。它可以對類的所有物件例項起作用。

通俗來講,就是可以鎖住乙個例項物件,拿到例項物件才能執行,另乙個是鎖住了乙個類,相當於鎖住了所有的例項物件,防止多個執行緒同時訪問這個類中的synchronized static 方法。

修飾例項方法: 作用於當前物件例項加鎖,進入同步**前要獲得當前物件例項的鎖。就像是乙個物件的所有方法之間搶奪這個物件的使用權,一旦乙個方法搶到了鎖,才能執行這個方法。而這個物件的其他synchronized方法這時不能執行。

修飾靜態方法: 也就是給當前類加鎖,會作用於類的所有物件例項,因為靜態成員不屬於任何乙個例項物件,是類成員( static 表明這是該類的乙個靜態資源,不管new了多少個物件,只有乙份)。所以如果乙個執行緒 a 呼叫乙個例項物件的非靜態 synchronized 方法,而執行緒 b 需要呼叫這個例項物件所屬類的靜態 synchronized 方法,是允許的,不會發生互斥現象,因為訪問靜態 synchronized 方法占用的鎖是當前類的鎖,而訪問非靜態 synchronized 方法占用的鎖是當前例項物件鎖。

修飾**塊: 指定加鎖物件,對給定物件加鎖,進入同步**庫前要獲得給定物件的鎖。給定乙個鎖物件,只有搶到這個鎖才能執行。

synchronized 關鍵字加到 static 靜態方法和 synchronized(class)**塊上都是是給 class 類上鎖。synchronized 關鍵字加到例項方法上是給物件例項上鎖。盡量不要使用 synchronized(string a) 因為jvm中,字串常量池具有快取功能!

mysql用大白話解釋 大白話說說mysql索引

前面其實寫了好幾篇關於 mysql 索引的文章了,文章中有具體的例項和 sql 語句,這篇文章我想再用純大白話講講 mysql 索引,文中不涉及具體 sql 我之前甚至想過為啥要用資料庫來儲存資料,用普通的 txt 或者 word 這類檔案不行麼,這個問題其實可以從幾個方面來看,乙個是併發訪問資料加...

大白話說 async await ,面試專用

async await 將非同步寫成同步的樣子,並保證執行順序,解決 地獄的問題 如果你是寫成 地獄的樣式,乙個請求成功以後,在 裡面巢狀下乙個 這樣多級巢狀的 函式弊端很多,不直觀,強耦合性,的不確定性,不利於維護和復用 async await就解決了這個問題 最下方有案例參考 1 async的作...

常見開源協議大白話說明

gpl 只要你用了任何該協議的庫 甚至是一段 那麼你的整個程式,不管以何種方式鏈結,都必須全部使用gpl協議 並遵循該協議開源。商業軟體公司一般禁用gpl 但可以使用gpl的可執行檔案和應用程式。agpl 即affero gpl,是gpl的更嚴格版本。只要你用了任何該協議的庫 甚至是一段 那麼執行時...