你理解的 synchronized 可能不對
synchronized對於使用java開發的人來說一定不陌生,同步是多執行緒很重要一個概念,因為比如對於共享資料可能需要多個執行緒操作,而共享資料物件本身又不支援多執行緒,這時就需要多執行緒操作。
多執行緒同步用synchronized,這個是沒有任何問題,但是synchronized作用在不同的地方,配合不同方式會產生不同效果,一個是作用在方法上,比如 public void synchronized read() ,在有就是作用在方法體內 synchronized(this) {}這兩種形式,作用在方法上表示方法為同步,作用在方法體上,表示方法體內同步。
用synchronized時會遇到一個問題,就是想同步地方沒有管理住,發現synchronized不管用,其實真實情況不是不管用而是沒用對。需要從java涉及幾個概念說起,一是類、一個是物件、一個是執行緒。
類是我們實際開發中主要編寫的東西,類編譯後生成Class檔案,他在虛擬機器執行並且只有一個。
物件是類的一個例項,一個類可以有很多例項,也就是很多物件。特殊類只有一個物件就是單例類。
執行緒是執行中的程式,整個物件執行態構成執行緒。
synchronized 在非靜態方法上以及synchronized(this)是鎖住物件,兌現在多個執行緒只有一個是可以鎖住的。多個執行緒有多個就鎖不住。
要想鎖住多個執行緒中多個物件採用,static synchronized或者synchronized(A.class),鎖住直接是基於類程式碼段,將來只會有一個執行緒進入這個程式碼段。這種鎖級別是類級別,是最大的,對於效能影響也是最大的,需要根據實際情況去用,要儘量少用。
在實際情況中能用物件鎖,儘量用物件鎖,多個執行緒共享物件,這樣效能是更高的。多執行緒鎖應用本身需要對物件、類、執行緒理解清晰,根據實際業務場景去用物件鎖還是類鎖。儘量不要在鎖中應用rpc,這樣會導致整個服務效能受到極大影響。