悲觀鎖和樂觀鎖
悲觀鎖:
只要進行操作就會對當前的操作上鎖,即悲觀的認爲此次操作可能會出現線程安全,故主動加鎖處理。
如:sync和lock
樂觀鎖:
不會對數據上鎖,而且通過將實際的數據與預期的數據進行比較,查到後做數據的變動。
如:cas機制、數據庫表的version
阻塞和非阻塞
阻塞:
會產生線程等待問題,當持有鎖的線程處理數據時,其他線程想要訪問這個數據,只能等鎖的釋放。
非阻塞:
不會線程等待,在線程訪問數據時,通過值的比較去判斷操作是否可行,期間其他線程可以做其他事情,也可以
自旋重試。
sync
重量級鎖,即會產生線程等待,也是一種悲觀鎖,具有可重入性(同一個對象的多個方法之間可傳遞)、可見性和原子性。
由於其會阻塞線程,故效率較低
lock
需要我們手動控制鎖的創建、使用和釋放,是一種輕量級鎖、悲觀鎖
其中lock鎖支持:
可重入鎖 ReentrantLock 鎖的傳遞
讀寫鎖 ReentrantReadWriteLock
cas無鎖機制
一種樂觀鎖,本質上不會鎖定對象,而是通過本地內存(也就是工作內存)中存放全局變量副本數據的值與主內存的數據值比較,
相同的話,去做數據的更新,不同的話,會將主內存的值刷新至本地內存,再次去請求比較,直到成功,即自旋
原子類
atomic類,底層都是採用樂觀鎖CAS機制去實現線程安全控制的