ios多線程三種方式區(qū)別 多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對這個(gè)變量進(jìn)行寫,到底要不要加鎖?
多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對這個(gè)變量進(jìn)行寫,到底要不要加鎖?先說結(jié)論:不必要如果不需要可見性,什么都不需要加如果需要保證可見性,則需要加volatile關(guān)鍵字。這里可以加鎖,但是沒必要,
多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對這個(gè)變量進(jìn)行寫,到底要不要加鎖?
先說結(jié)論:不必要
- 如果不需要可見性,什么都不需要加
- 如果需要保證可見性,則需要加volatile關(guān)鍵字。這里可以加鎖,但是沒必要,對性能有影響
下面簡單解釋下原因:
加鎖是因?yàn)椴僮鞑皇窃有缘?,以i 這個(gè)操作來解釋,看下面兩張圖。
i 這個(gè)操作需要
- 先將i的值從內(nèi)存中讀出來
- 然后加1
- 最后寫回去
看上面第二張圖,能很清楚的理解流程吧?
加鎖就是保證上面的三步是一個(gè)原子操作。
回到問題,這里只有一個(gè)線程寫,實(shí)際沒有競爭,所以沒必要加鎖。
但是,看第一張圖,因?yàn)橛兄鲀?nèi)存和本地內(nèi)存的存在
- 線程先寫入本地內(nèi)存
- 然后刷入主內(nèi)存
- 其它內(nèi)存同步主內(nèi)存到工作內(nèi)存
- 然后從工作內(nèi)存中讀取
一個(gè)線程寫入后,不能保證其它線程立即看到,這就是可見性問題。
加了volatile關(guān)鍵字后,會(huì)強(qiáng)制操作后同步工作內(nèi)存和主內(nèi)存,保證其它線程立刻看到。
ios多線程模式怎么開蘋果手機(jī)怎么沒有多線程優(yōu)化?
進(jìn)入軟件的設(shè)置里,就可看到多線程設(shè)置的相關(guān)選項(xiàng)。蘋果處理器不同于安卓陣營,它的處理器沒有那么多的“核”,沒有多線程模式的太多設(shè)置選項(xiàng),也沒有開關(guān)按鈕,系統(tǒng)默認(rèn)直接開啟(所以無法關(guān)閉),目前只有iphone7/7 Plus、iphone8/8 Plus和iphone X這些高性能機(jī)型開了多線程,其他機(jī)型都沒開。希望我的解答能夠幫助您。