不多說,直接上乾貨!
擴充套件部落格
牛客網Java刷題知識點之多執行緒同步的實現方法有哪些
為何要使用同步?
java允許多執行緒併發控制,當多個執行緒同時操作一個可共享的資源變數時(如資料的增刪改查), 將會導致資料不準確,相互之間產生衝突,因此加入同步鎖以避免在該執行緒沒有完成操作之前,被其他執行緒的呼叫,從而保證了該變數的唯一性和準確性。
什麼是同步方法 ,什麼是同步程式碼塊?
用synchronized關鍵字修飾的方法。 用synchronized關鍵字修飾的語句塊。
在java程式碼中,每一個物件都擁有一把鎖,使用synchronzied關鍵字可以獲取到物件上的鎖。該關鍵字可以用到方法上或者程式碼塊上。
同步方法:(粗粒度鎖):
1.修飾一般方法: public synchronized void method (){...},獲取的是當前呼叫 物件this上的鎖
2.修飾靜態方法: public static synchronized void method (){...},獲取當前類的 位元組碼物件上的鎖
即在方法的宣告之前加入synchronized 關鍵字
public synchronized void mutiThreadAccess();
同步程式碼塊(細粒度鎖):
synchronized ( obj ) {...},同步程式碼塊可以指定獲取哪個物件上的鎖。
synchronized(syncObject) { //訪問syncObject的程式碼 }
同步程式碼塊使用的鎖是任意物件Object。
同步方法使用的鎖是this。
使用靜態修飾的同步函式使用的是該類所在的位元組碼檔案物件,格式為類名.class。
同步方法預設用this或者當前類class物件作為鎖;
同步程式碼塊可以選擇以什麼來加鎖,比同步方法要更細顆粒度,我們可以選擇只同步會發生同步問題的部分程式碼而不是整個方法;
同步方法預設用this或者當前類class物件作為鎖;
同步程式碼塊可以選擇以什麼來加鎖,比同步方法要更細顆粒度,我們可以選擇只同步會發生同步問題的部分程式碼而不是整個方法;
同步方法使用關鍵字 synchronized修飾方法,而同步程式碼塊主要是修飾需要進行同步的程式碼,用 synchronized(object){程式碼內容}進行修飾;