Java多線程的悲觀鎖與樂觀鎖

 一:悲觀鎖多線程

      悲觀鎖,就是無論是否發生多線程衝突,只要存在這種可能,就每次訪問都加鎖,加鎖就會致使鎖之間的爭奪,有爭奪就會有輸贏,輸者等待。線程

      syncrhoized是一種獨佔鎖,即:佔用該鎖的線程才能夠執行,申請該鎖的線程就只能掛起等待,直到佔用鎖的線程釋放鎖才喚醒,拿到鎖並執行。因爲在進程掛起和恢復執行過程當中存在着很大的開銷,而且當一個線程正在等待鎖時,它不能作任何事。因此syncrhoized是一種悲觀鎖,凡是用syncrhoized加了鎖的多線程之間都會因鎖的爭奪結果致使掛起、喚醒等開銷。進程

 

    二:樂觀鎖同步

      得到鎖後一直持有鎖以防本線程再次申請該鎖形成無謂的解鎖再加鎖開銷,或者假設沒有衝突而去完成同步代碼塊若是衝突再循環重試,或者採起申請鎖失敗後不馬上掛起而是稍微等待再次嘗試獲取 等待策略,以減小線程由於掛起、阻塞、喚醒(發生CPU的調度切換) 而形成的開銷。循環

      偏向鎖、輕量級鎖(CAS輪詢)、自旋鎖 就是基於上述思路的樂觀鎖。阻塞

 

      在多線程的加鎖機制中,JVM會首先嚐試樂觀鎖,失敗後才調用悲觀鎖。sync

相關文章
相關標籤/搜索