1、鎖
一、可見性:
定義:數據對全部線程可見java
緣由:cpu操做數據時會把數據讀取到內存中去,能夠理解爲值作了備份,可是備份數據和原始數據在後續操做中不必定一致緩存
實現:java使用volite關鍵字來實現,是最先的緩存一致性解決方案安全
原理:藉助與cpu緩存一致的解決性方案,操做系統抽象其爲lock操做spa
二、原子性:
定義:操做拆分爲多個步驟後,在執行過程當中中間變量被其它修改,致使操做和預期的不一致操作系統
三、隔離區(臨界區)
定義:要實現多個線程對變量操做的安全性,就要實現操做的串行化線程
實現:java使用synchronized來實現對象
原理:對象在內存的頭部有一個標識內存
悲觀鎖:其餘線程操做時,加鎖,悲觀的認爲鎖不會立刻釋放,阻塞等待喚醒【算了。停在這等吧】it
阻塞態到運行態會很耗時鐘,若是預期不會立刻喚醒,可使用悲觀鎖變量
樂觀鎖:其餘線程操做時,加鎖,樂觀的認爲鎖會立刻釋放,一直在輪詢標誌,查看鎖釋放狀態【一直在問鎖釋放了沒?】
一直運行於運行態,短時喚醒能夠考慮,預期鎖釋放時間較長會更耗時鐘