悲觀鎖:線程拿到資源時,就對資源上鎖,並在提交後,才釋放鎖資源,其餘線程才能使用資源 常見:synchronized、Lock,行鎖,表鎖,讀鎖,寫鎖等
樂觀鎖:拿到資源時,在提交以前,其餘的鎖也能夠操做這個資源。當有衝突的時候,併發機制會保留前一個提交,打回後一個提交,讓後一個線程從新獲取資源後,再操做,而後提交。常見實現方式:版本號控制,CAS(通常狀況下是一個自旋操做,即不斷的重試)
公平鎖FairSync :就是當前資源被加鎖後,其餘全部請求線程按照請求的前後順序擱置到queue中,當鎖被釋放放掉,而後嚴格的按照先進先出的原則一個一個加鎖
非公平鎖NonfairSync:嘗試給共享資源加鎖,若是加鎖成功就阻塞其餘線程;若是是共享資源上已經被加鎖了,這個時候在進入隊列的時候還要再判斷下資源有沒有被釋放掉能不能加鎖,兩次嘗試加鎖都失敗再霸道也沒用了,就只能老老實實去隊列尾部排隊 。ReentrantLock、ReadWriteLock默認都是非公平模式
可重入鎖:可重入就是說某個線程已經得到某個鎖,能夠再次獲取鎖而不會出現死鎖。例如:synchronized,ReentrantLock
非可重入鎖:當前線程執行某個方法已經獲取了該鎖,那麼在方法中嘗試再次獲取鎖時,就會獲取不到被阻塞
共享鎖(讀鎖):得到共享鎖以後,能夠查看但沒法修改和刪除數據(若是線程T對數據A加上共享鎖後,則其餘線程只能對A再加共享鎖,不能加排它鎖)
排他鎖(寫鎖,獨享鎖):得到排他鎖後,既能讀數據,又能修改數據F(若是線程T對數據A加上排它鎖後,則其餘線程不能再對A加任何類型的鎖)多線程
鎖的狀態總共有四種:無鎖狀態、偏向鎖、輕量級鎖和重量級鎖
偏向鎖:偏向鎖會偏向於第一個得到它的線程,若是在接下來的執行過程當中,該鎖沒有被其餘的線程獲取,則持有偏向鎖的線程將永遠不須要同步。大多數狀況下,鎖不只不存在多線程競爭,並且老是由同一線程屢次得到,爲了讓線程得到鎖的代價更低而引入了偏向鎖
輕量級鎖: 輕量級鎖提高程序同步性能的依據是:對於絕大部分的鎖,在整個同步週期內都是不存在競爭的(區別於偏向鎖)。這是一個經驗數據。若是沒有競爭,輕量級鎖使用CAS操做避免了使用互斥量的開銷,但若是存在鎖競爭,除了互斥量的開銷外,還額外發生了CAS操做,所以在有競爭的狀況下,輕量級鎖比傳統的重量級鎖更慢(核心:被加鎖的代碼不會發生併發,若是發生併發,那就膨脹成重量級鎖)
重量級鎖:依賴對象內部的monitor鎖來實現的,而monitor又依賴操做系統的MutexLock(互斥鎖)來實現的,因此重量級鎖也被成爲互斥鎖 。Synchronized效率低的緣由:線程之間的切換這就須要從用戶態轉換到核心態併發
過程:性能
(1)若是monitor的進入數爲0,則該線程進入monitor,而後將進入數設置爲1,該線程即爲monitor的全部者
(2)若是線程已經佔有該monitor,只是從新進入,則進入monitor的進入數加1
(3)若是其餘線程已經佔用了monitor,則該線程進入阻塞狀態,直到monitor的進入數爲0,再從新嘗試獲取monitor的全部權spa
另外:synchronized關鍵字並不是一開始就該對象加上重量級鎖,也是從偏向鎖,輕量級鎖,再到重量級鎖的過程操作系統