回覆列表
  • 1 # 此生唯一

    這是毋庸置疑的,因為執行緒加鎖其實是很吃資源的!

    我們都知道,多執行緒模型中,為了避免執行緒之間的資料互串,影響資料安全,都會在方法或者指定的操作上加鎖,最原始的加鎖方式就是synchronize,這在以前被稱為重度鎖,因為加鎖是違背了多執行緒模型的效率的!

    加鎖的原理是什麼呢?以a=1;a=b+1為例,編譯器編譯的時候會在這段程式碼之前加上一個標誌比如說lock,同時在這段程式碼的後面加上標誌unlock,在程式碼執行期間,一個執行緒進入這段程式碼之後先把lock置為加鎖位,然後下一個執行緒過來訪問這段程式碼的時候,發現已經上鎖,就只能阻塞等待,等到第一個執行緒執行完了,把狀態改了,然後通知後面的執行緒去繼續執行!

    當然這是最簡化模型的鎖,一般鎖有讀寫鎖,條件鎖,自旋鎖等會有不同的喚醒方式和不同的效能消耗!但無論如何,加鎖都是在保證資料安全的條件下對多執行緒效能的汙染!

    那麼,怎麼避免加鎖的效能下降呢?

    1,從業務上避免大量鎖結構的產生!

    2,使用threadlocal,這能保證每個執行緒中的資料不會互相汙染!

    3,多讀少寫的情況,使用讀寫鎖!

    4,自旋鎖會對CPU形成挑戰,雖然是執行緒佔用時間很少的鎖!

    5,鎖的粒度儘量小:能在方法內的鎖,就不要佔用整個方法

    志在用通俗易懂的方式學習高新技術,更多的技術分享,會不定時更新,敬請關注。。

  • 中秋節和大豐收的關聯?
  • 求鄧紫棋在"我是歌手"裡唱過的所有歌及其排名,謝謝?