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