線程鎖synchronized 如何理解線程鎖進(jìn)程鎖和文件鎖等各種鎖?
如何理解線程鎖進(jìn)程鎖和文件鎖等各種鎖?線程鎖是鎖線程的,鎖住禁用,如果4線程的CPU鎖一個(gè)線程剩余三個(gè)(如果可以鎖的話),就像四車道封鎖一條車道還剩3個(gè)車道可以跑車;進(jìn)程鎖是鎖進(jìn)程的,進(jìn)程就是正在運(yùn)行
如何理解線程鎖進(jìn)程鎖和文件鎖等各種鎖?
線程鎖是鎖線程的,鎖住禁用,如果4線程的CPU鎖一個(gè)線程剩余三個(gè)(如果可以鎖的話),就像四車道封鎖一條車道還剩3個(gè)車道可以跑車;進(jìn)程鎖是鎖進(jìn)程的,進(jìn)程就是正在運(yùn)行的程序,鎖住進(jìn)程就是鎖住程序禁止程序的任何操作,就像鎖住汽車不能開車一樣。文件鎖是鎖文件的,文件鎖住就無法使用,必須解鎖才可以使用。
多線程編程的時(shí)候,使用無鎖結(jié)構(gòu)會不會比有鎖結(jié)構(gòu)更加快?
這是毋庸置疑的,因?yàn)榫€程加鎖其實(shí)是很吃資源的!
我們都知道,多線程模型中,為了避免線程之間的數(shù)據(jù)互串,影響數(shù)據(jù)安全,都會在方法或者指定的操作上加鎖,最原始的加鎖方式就是synchronize,這在以前被稱為重度鎖,因?yàn)榧渔i是違背了多線程模型的效率的!
加鎖的原理是什么呢?以a=1a=b+1為例,編譯器編譯的時(shí)候會在這段代碼之前加上一個(gè)標(biāo)志比如說lock,同時(shí)在這段代碼的后面加上標(biāo)志unlock,在代碼運(yùn)行期間,一個(gè)線程進(jìn)入這段代碼之后先把lock置為加鎖位,然后下一個(gè)線程過來訪問這段代碼的時(shí)候,發(fā)現(xiàn)已經(jīng)上鎖,就只能阻塞等待,等到第一個(gè)線程執(zhí)行完了,把狀態(tài)改了,然后通知后面的線程去繼續(xù)執(zhí)行!
當(dāng)然這是最簡化模型的鎖,一般鎖有讀寫鎖,條件鎖,自旋鎖等會有不同的喚醒方式和不同的性能消耗!但無論如何,加鎖都是在保證數(shù)據(jù)安全的條件下對多線程性能的污染!
那么,怎么避免加鎖的性能下降呢?
1,從業(yè)務(wù)上避免大量鎖結(jié)構(gòu)的產(chǎn)生!
2,使用threadlocal,這能保證每個(gè)線程中的數(shù)據(jù)不會互相污染!
3,多讀少寫的情況,使用讀寫鎖!
4,自旋鎖會對CPU形成挑戰(zhàn),雖然是線程占用時(shí)間很少的鎖!
5,鎖的粒度盡量小:能在方法內(nèi)的鎖,就不要占用整個(gè)方法
志在用通俗易懂的方式學(xué)習(xí)高新技術(shù),更多的技術(shù)分享,會不定時(shí)更新,敬請關(guān)注。。
感覺C 很簡單,但為何這么多勸退的?
寫cpp,語法的痛苦點(diǎn)模板,等你模板報(bào)錯(cuò)達(dá)到幾百行的時(shí)候,你就會明白勸退 1。第二個(gè)痛苦點(diǎn),內(nèi)存操作,包括內(nèi)存越界,內(nèi)存泄露,內(nèi)存臟數(shù)據(jù),共享內(nèi)存,內(nèi)存池等所有相關(guān),遲早會遇到程序崩潰,勸退 1。第三個(gè)痛點(diǎn),鎖和多進(jìn)程多線程還有協(xié)程,以及管道通信,消息機(jī)制。這些都是操作系統(tǒng)相關(guān)的知識,要搞明白不比學(xué)cpp簡單。勸退 1。第四個(gè),既然用了cpp,那就遲早要用到so,dll,對應(yīng)的debug噩夢來了,服務(wù)器上用gdb調(diào)試帶so的多進(jìn)程多線程程序的難度和復(fù)雜度,會讓人迷失。勸退 1。第五個(gè),平臺,編譯器不同,優(yōu)化和不優(yōu)化導(dǎo)致程序運(yùn)行結(jié)果不同,這個(gè)時(shí)候我都是無語問蒼天。第六個(gè),宏噩夢,dll依賴噩夢,cpp編譯時(shí)間長噩夢,以及系統(tǒng)突然升級(安全漏洞修復(fù))導(dǎo)致某個(gè)庫不兼容的噩夢。沒經(jīng)歷過的人是體會不到的。