多線程編程,使用無鎖結構會不會比有鎖結構更加快?

上官馨雪

這是毋庸置疑的,因為線程加鎖其實是很吃資源的!

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


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


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

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

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

2,使用threadlocal,這能保證每個線程中的數據不會互相汙染!

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

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

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

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


謝逅架構

在一個程序中,這些獨立運行的程序片斷叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。


快樂的一幫人

這是必然的。

想想你回家,需要開門和不需要開門哪個進入的方式快?

所以無鎖結構會更快。但對共享資源或者全局資源的使用,必須串行使用。

進程和線程模型,就是有鎖的搶佔模式

協程,就是串行的時分複用,非搶佔模式。


小鳥攻城獅

無鎖結構沒有額外開銷,所以肯定會效率更高。多線程的鎖是通過軟件實現的,需要耗費一定的資源,頻繁的使用鎖來同步線程,會導致額外的開銷,在一定程度上影響整體線程的執行效率,無鎖可以砍掉這些額外的開銷,但如果實現起來可能比有鎖版本的軟件要複雜些,效率理論上有一定的提升,實際上可能兩者差不多。


分享到:


相關文章: