寶寶們,面試官問你多線程的理解,不要再說Okttp、流程框架已經(jīng)幫我們封裝好了,一般使用不到,關(guān)于多線程你應(yīng)該知道這些了。正常的話,面試官會問你
1.創(chuàng)建線程有幾種方式?
2.多線程的三大原則?
3.怎樣保證線程安全?volite兩個特性是什么?sychronized和volite有什么區(qū)別?
4.來了一個新任務(wù),多線程是如何處理的?
上干貨?。。?/p>
創(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)化。
來了一個新任務(wù),多線程是如何處理的?
多線程中會設(shè)置核心線程數(shù),最大線程數(shù),阻塞隊列。其中
核心線程數(shù)+非核心線程數(shù)=最大線程數(shù)。
1.來一個任務(wù),看是否有空閑核心線程。有執(zhí)行在核心線程。
2.如果核心線程數(shù)已滿,是否還可以加入阻塞隊列,阻塞隊列不滿加入阻塞隊列。
3.如果阻塞隊列已滿,是否有空閑的非核心線程。有執(zhí)行在非核心線程。
4.如果沒有空閑的非核心線程,我們使用拒絕策略拒絕這個任務(wù)。
---------多線程部分《摘自Android進階之光》劉望舒