synchronized理解及優化

2021-10-09 22:19:33 字數 765 閱讀 5556

synchronized(object)

object不要使用string常量 integer 和long

鎖的是物件不是** this ***.class 通過物件頭上的標識,markword的前四個位元組

synchronized修飾方法時 this為這把鎖

synchronized修飾靜態方法時,當前類名.class 為鎖

synchronized修飾**塊時 括號裡是誰就是誰

object o = new object()

synchronized(o)鎖公升級:

偏向鎖:不用搶,偏向於第乙個執行緒,看到synchronized就會有競爭,哪怕是乙個執行緒,有了偏向鎖,其實不是鎖,一進來後貼個標籤,解決執行緒安全的類(stringbuffer)80%是非多執行緒下執行,不需要進行synchronized競爭,為了優化synchronized**而設計的,只要有別的執行緒過來搶,鎖就的公升級。

第一次鎖公升級到輕量級鎖

自旋鎖(迴圈等著,輕量級)、juc包中的類,cas為理論支撐

輕量級到重量級鎖的公升級:耗時過長或自旋次數

進入等待佇列等待作業系統排程(重量級鎖)

**執行快 執行緒少 使用自旋鎖 

**執行慢 執行緒多 使用重量級鎖

優化思路:

1、鎖的細化:同步**塊中的**越少越好。

2、鎖的粗化:很多細粒度的細化不如加粗。

3、將鎖物件final化 避免別修改 導致鎖失效。

4、不要使用string作為鎖。

synchronized 及 執行緒通訊

執行緒通訊 共享物件 wait notify 和 notifyall機制 並發包中的condition 不要在字串常量或全域性物件中呼叫wait 因為可能呼叫notify或notifyall的時候 不知道喚醒了哪乙個,或者為什麼都喚醒了?因為多個引用指向的是同乙個物件!丟失訊號 如果乙個執行緒先於被...

初步使用synchronized及心得

假設需要實現以下功能 設計乙個併發程式,併發10個執行緒,每個執行緒累加scount一百萬次,將scount加到一千萬 public class synctest implements runnable private void increasecount public static void ma...

synchronized關鍵字的理解

synchronized塊 鎖定的是指定物件,塊只是鎖定期間執行的操作。synchronized修飾非靜態方法,鎖定的是該類的例項,同乙個例項 單例 在多執行緒中呼叫才會觸發同步鎖定,所以,多個被synchronized修飾的非靜態方法在同一例項下,只能多執行緒同時呼叫乙個 synchronized...