java多線程的鎖機制

源於螞蟻課堂的學習,點擊這裏查看(老餘很給力) 

悲觀鎖和樂觀鎖

悲觀鎖:
    只要進行操作就會對當前的操作上鎖,即悲觀的認爲此次操作可能會出現線程安全,故主動加鎖處理。
    如:sync和lock

樂觀鎖:
    不會對數據上鎖,而且通過將實際的數據與預期的數據進行比較,查到後做數據的變動。
    如:cas機制、數據庫表的version

 

阻塞和非阻塞

阻塞:
    會產生線程等待問題,當持有鎖的線程處理數據時,其他線程想要訪問這個數據,只能等鎖的釋放。

非阻塞:
    不會線程等待,在線程訪問數據時,通過值的比較去判斷操作是否可行,期間其他線程可以做其他事情,也可以
自旋重試。

 

sync

重量級鎖,即會產生線程等待,也是一種悲觀鎖,具有可重入性(同一個對象的多個方法之間可傳遞)、可見性和原子性。
由於其會阻塞線程,故效率較低

 

lock

需要我們手動控制鎖的創建、使用和釋放,是一種輕量級鎖、悲觀鎖

其中lock鎖支持:
可重入鎖 ReentrantLock 鎖的傳遞
讀寫鎖 ReentrantReadWriteLock

 

cas無鎖機制 

一種樂觀鎖,本質上不會鎖定對象,而是通過本地內存(也就是工作內存)中存放全局變量副本數據的值與主內存的數據值比較,
相同的話,去做數據的更新,不同的話,會將主內存的值刷新至本地內存,再次去請求比較,直到成功,即自旋

 

原子類 

atomic類,底層都是採用樂觀鎖CAS機制去實現線程安全控制的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章