011 深入理解synchronized
阿新 • • 發佈:2018-05-01
syn zed 重新 現在 概念 his span 四種 spa
一 .概述
在前面我們使用synchronized完成了一個原子方法的實現.現在我們需要深入的理解這個關鍵詞.
二 . 使用方式
對於這個關鍵詞我們的使用方式有四種:
[1]修飾普通方法
[2]修飾靜態方法
[3]對實例對象加互斥鎖
[4]對類對象加互斥鎖
我們首先需要知道的就是synchronized就是使用互斥鎖的方式完成線程的同步,
原理就是對於臨界資源的操作保持互斥.
三 . 實現方式
public synchronized void add1() { count ++; }public static void add2() { count ++; } public void add3() { synchronized (this) { count ++ ; } } public static void add4() { synchronized (Test.class) { count ++; } }
上面的代碼之中,我們分別將synchronized關鍵詞放在了不同的地方使用,看起來使用的情況是比較復雜的.
但是總結一些:
synchronized就是完成了互斥鎖的概念,獲取到了鎖的線程可以運行,其它沒有獲取鎖的線程如搶不到鎖就進入
block隊列之中.
那麽:synchronized關鍵詞修飾實例方法就相當於是用當前調用方法的對象作為互斥鎖.
修飾的靜態方法就相當於拿到class字節碼作為互斥鎖.
四 . 限制
synchronized關鍵詞代表的互斥鎖的限制比較大,
一旦一個線程由於搶奪鎖失敗就會進入阻塞隊列之中,需要等待鎖被重新釋放.
如果那個搶占鎖的線程運行的時間很長,那麽互斥鎖的代價就太高了.
因此JDK在後面引入了偏向鎖,自旋鎖來改進互斥鎖,
但是他們本質上都是互斥鎖,因此這個關鍵詞代表的互斥鎖是一種重量級別的鎖.
011 深入理解synchronized