寶寶們助隧,面試官問你多線程的理解唆香,不要再說Okttp嫌变、流程框架已經(jīng)幫我們封裝好了,一般使用不到躬它,關于多線程你應該知道這些了腾啥。正常的話,面試官會問你
1.創(chuàng)建線程有幾種方式冯吓?
2.多線程的三大原則倘待?
3.怎樣保證線程安全?volite兩個特性是什么组贺?sychronized和volite有什么區(qū)別凸舵?
4.來了一個新任務,多線程是如何處理的失尖?
上干貨0⊙佟!掀潮!
創(chuàng)建線程有幾種方式菇夸?
三種。
1.繼承Thread類仪吧。
2.實現(xiàn)Runnable接口庄新。
3.實現(xiàn)Callable接口。
多線程的三大原則薯鼠?
原子性择诈,可見性,有序性出皇。
怎樣保證線程安全吭从?
使用鎖保證線程安全,如sychronized恶迈、volite涩金、ReentryLock。
volite兩個特性是什么暇仲?
volite的兩個特性是可見性和禁止指令重排序步做。可見性是線程在獲取volite屬性時奈附,需要去主內(nèi)存刷新數(shù)據(jù)到線程內(nèi)存中全度,寫數(shù)據(jù)要去更新到主內(nèi)存中。禁止指令重排序最經(jīng)典的例子是單例的DCL斥滤,由于創(chuàng)建對象分為3個步驟将鸵,分配內(nèi)存空間勉盅,初始化成員屬性和構(gòu)造方法,將引用指向內(nèi)存空間顶掉,草娜。由于Java是亂序執(zhí)行,在多線程環(huán)境痒筒,創(chuàng)建對象的第二步最后執(zhí)行宰闰,會出現(xiàn)對象已經(jīng)不為空,但是調(diào)用使用它的屬性去調(diào)用方法會崩潰簿透,因為此時還沒有初始化成員屬性移袍。
sychronized和volite有什么區(qū)別?
sychronized僅有獲得鎖的當前線程訪問老充,其他線程不能訪問葡盗。volite所有線程都可以訪問,需要從主內(nèi)存瀆值啡浊。
sychronized可以作用在類觅够、方法,代碼塊虫啥。volite可以作用在變量蔚约。
sychronized保證原子性奄妨,volite不能保證原子性涂籽。
sychronized會造成線程阻塞,volite不會造成線程阻塞砸抛。
synchronized可以被編譯器優(yōu)化评雌,volite不可以被編譯器優(yōu)化。
來了一個新任務直焙,多線程是如何處理的景东?
多線程中會設置核心線程數(shù),最大線程數(shù)奔誓,阻塞隊列斤吐。其中
核心線程數(shù)+非核心線程數(shù)=最大線程數(shù)。
1.來一個任務厨喂,看是否有空閑核心線程和措。有執(zhí)行在核心線程。
2.如果核心線程數(shù)已滿蜕煌,是否還可以加入阻塞隊列派阱,阻塞隊列不滿加入阻塞隊列。
3.如果阻塞隊列已滿斜纪,是否有空閑的非核心線程贫母。有執(zhí)行在非核心線程文兑。
4.如果沒有空閑的非核心線程,我們使用拒絕策略拒絕這個任務腺劣。
---------多線程部分《摘自Android進階之光》劉望舒