悲觀鎖:執行緒拿到資源時,就對資源上鎖,并在提交后,才釋放鎖資源,其他執行緒才能使用資源 常見: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的所有權
另外:synchronized關鍵字并非一開始就該物件加上重量級鎖,也是從偏向鎖,輕量級鎖,再到重量級鎖的程序
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/21182.html
標籤:其他
上一篇:糟糕的中文版龍書
下一篇:決議幾何
