Python知識(shí)分享網(wǎng) - 專業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
Java高級(jí)面試題,經(jīng)典多線程并發(fā)問題和答案 PDF 下載
匿名網(wǎng)友發(fā)布于:2024-02-18 10:45:01
(侵權(quán)舉報(bào))
(假如點(diǎn)擊沒反應(yīng),多刷新兩次就OK!)

Java高級(jí)面試題,經(jīng)典多線程并發(fā)問題和答案  PDF 下載  圖1

 

 

資料內(nèi)容:

 

 

1、 并發(fā)編程三要素?
1) 原子性
原子性指的是一個(gè)或者多個(gè)操作, 要么全部執(zhí)行并且在執(zhí)行的過程中不被其他操作打
斷, 要么就全部都不執(zhí)行。
2) 可見性
可見性指多個(gè)線程操作一個(gè)共享變量時(shí), 其中一個(gè)線程對(duì)變量進(jìn)行修改后, 其他線
程可以立即看到修改的結(jié)果。
3) 有序性
有序性, 即程序的執(zhí)行順序按照代碼的先后順序來執(zhí)行。
2、 實(shí)現(xiàn)可見性的方法有哪些?
synchronized 或者 Lock: 保證同一個(gè)時(shí)刻只有一個(gè)線程獲取鎖執(zhí)行代碼, 鎖釋放之
前把最新的值刷新到主內(nèi)存, 實(shí)現(xiàn)可見性。
3、 多線程的價(jià)值?
1) 發(fā)揮多核 CPU 的優(yōu)勢(shì)
多線程, 可以真正發(fā)揮出多核 CPU 的優(yōu)勢(shì)來, 達(dá)到充分利用 CPU 的目的, 采用
多線程的方式去同時(shí)完成幾件事情而不互相干擾。
2) 防止阻塞
從程序運(yùn)行效率的角度來看, 單核 CPU 不但不會(huì)發(fā)揮出多線程的優(yōu)勢(shì), 反而會(huì)因?yàn)?
在單核 CPU 上運(yùn)行多線程導(dǎo)致線程上下文的切換, 而降低程序整體的效率。 但是單
CPU 我們還是要應(yīng)用多線程, 就是為了防止阻塞。 試想, 如果單核 CPU 使用
單線程, 那么只要這個(gè)線程阻塞了, 比方說遠(yuǎn)程讀取某個(gè)數(shù)據(jù)吧, 對(duì)端遲遲未返回
又沒有設(shè)置超時(shí)時(shí)間, 那么你的整個(gè)程序在數(shù)據(jù)返回回來之前就停止運(yùn)行了。 多線
程可以防止這個(gè)問題, 多條線程同時(shí)運(yùn)行,哪怕一條線程的代碼執(zhí)行讀取數(shù)據(jù)阻塞,
也不會(huì)影響其它任務(wù)的執(zhí)行。
3) 便于建模
這是另外一個(gè)沒有這么明顯的優(yōu)點(diǎn)了。 假設(shè)有一個(gè)大的任務(wù) A, 單線程編程, 那么
就要考慮很多, 建立整個(gè)程序模型比較麻煩。 但是如果把這個(gè)大的任務(wù) A 分解成幾
個(gè)小任務(wù), 任務(wù) B、 任務(wù) C、 任務(wù) D, 分別建立程序模型, 并通過多線程分別運(yùn)
行這幾個(gè)任務(wù), 那就簡(jiǎn)單很多了。
4、 創(chuàng)建線程的有哪些方式?
1) 繼承 Thread 類創(chuàng)建線程類
2) 通過 Runnable 接口創(chuàng)建線程類
3) 通過 Callable Future 創(chuàng)建線程
4) 通過線程池創(chuàng)建
5、 創(chuàng)建線程的三種方式的對(duì)比?
1) 采用實(shí)現(xiàn) Runnable、 Callable 接口的方式創(chuàng)建多線程。
優(yōu)勢(shì)是:線程類只是實(shí)現(xiàn)了 Runnable 接口或 Callable 接口, 還可以繼承其他類。 在這種方
式下, 多個(gè)線程可以共享同一個(gè) target 對(duì)象, 所以非常適合多個(gè)相同線程來處理同
一份資源的情況,從而可以將 CPU、 代碼和數(shù)據(jù)分開, 形成清晰的模型, 較好地體
現(xiàn)了面向?qū)ο蟮乃枷搿?
劣勢(shì)是:
編程稍微復(fù)雜, 如果要訪問當(dāng)前線程, 則必須使用 Thread.currentThread()方法。
2) 使用繼承 Thread 類的方式創(chuàng)建多線程
優(yōu)勢(shì)是:
編寫簡(jiǎn)單, 如果需要訪問當(dāng)前線程, 則無需使用 Thread.currentThread()方法, 直接
使用 this 即可獲得當(dāng)前線程。
劣勢(shì)是:
線程類已經(jīng)繼承了 Thread 類, 所以不能再繼承其他父類。
3Runnable Callable 的區(qū)別
1、 Callable 規(guī)定(重寫) 的方法是 call(), Runnable 規(guī)定(重寫) 的方法是
run()。
2Callable 的任務(wù)執(zhí)行后可返回值, 而 Runnable 的任務(wù)是不能返回值的。
3、 Call 方法可以拋出異常, run 方法不可以。
4、 運(yùn)行 Callable 任務(wù)可以拿到一個(gè) Future 對(duì)象, 表示異步計(jì)算的結(jié)果。 它提供
了檢查計(jì)算是否完成的方法, 以等待計(jì)算的完成, 并檢索計(jì)算的結(jié)果。 通過 Future
對(duì)象可以了解任務(wù)執(zhí)行情況, 可取消任務(wù)的執(zhí)行, 還可獲取執(zhí)行結(jié)果。