數(shù)據(jù)交換的三種方式 Java項(xiàng)目里哪些場(chǎng)景適合使用單線程,哪些場(chǎng)景適合使用多線程?
Java項(xiàng)目里哪些場(chǎng)景適合使用單線程,哪些場(chǎng)景適合使用多線程?事實(shí)上,項(xiàng)目中使用的單線程并不多。業(yè)務(wù)需求通常非常復(fù)雜,實(shí)現(xiàn)它們并不容易。當(dāng)我第一次學(xué)習(xí)時(shí),也可以使用單線程。將來,無論是單獨(dú)做系統(tǒng)還是項(xiàng)
Java項(xiàng)目里哪些場(chǎng)景適合使用單線程,哪些場(chǎng)景適合使用多線程?
事實(shí)上,項(xiàng)目中使用的單線程并不多。業(yè)務(wù)需求通常非常復(fù)雜,實(shí)現(xiàn)它們并不容易。當(dāng)我第一次學(xué)習(xí)時(shí),也可以使用單線程。將來,無論是單獨(dú)做系統(tǒng)還是項(xiàng)目,我們通常都需要支持多個(gè)用戶。它們大多數(shù)是多線程的,但是我們可以從單線程開始,這是非常重要的。
多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對(duì)這個(gè)變量進(jìn)行寫,到底要不要加鎖?
下面簡(jiǎn)要說明以下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們用操作一來解釋它??聪旅鎯蓚€(gè)圖。
我這個(gè)操作需要
看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過程嗎?
鎖定是為了確保上述三個(gè)步驟是原子操作。
回到問題上來,只有一個(gè)線程要寫,沒有競(jìng)爭(zhēng),所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個(gè)線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。
java電商項(xiàng)目,什么場(chǎng)景需要使用多線程?
場(chǎng)景1:業(yè)務(wù)邏輯中有許多周期,每個(gè)周期之間沒有影響。例如,需要驗(yàn)證是否存在10000個(gè)URL路徑。一般情況下,需要循環(huán)10000次對(duì)每個(gè)URL逐一進(jìn)行驗(yàn)證,效率會(huì)很低。假設(shè)驗(yàn)證一個(gè)需要1分鐘,總共需要1萬(wàn)分鐘,這有點(diǎn)可怕。此時(shí),可以使用多線程技術(shù)將10000個(gè)URL等分為50個(gè)部分,打開50個(gè)線程,每個(gè)線程只需要驗(yàn)證200個(gè)線程,這樣所有線程的執(zhí)行時(shí)間都遠(yuǎn)小于10000分鐘。
場(chǎng)景2:您需要知道任務(wù)的執(zhí)行進(jìn)度,例如我們經(jīng)??吹降倪M(jìn)度條。實(shí)現(xiàn)方法可以是:在任務(wù)中添加一個(gè)整數(shù)屬性變量(這樣可以共享不同的方法),當(dāng)任務(wù)執(zhí)行到一定程度時(shí),給變量的值加1,打開一個(gè)線程,每隔一段時(shí)間連續(xù)訪問變量并反饋給用戶。
總之,使用多線程是為了充分利用CPU資源,提高程序執(zhí)行效率。當(dāng)您發(fā)現(xiàn)業(yè)務(wù)邏輯的執(zhí)行效率特別低且耗時(shí)時(shí),可以考慮使用多線程。但是,CPU執(zhí)行哪個(gè)線程的時(shí)間和順序是不確定的。即使設(shè)置了線程的優(yōu)先級(jí),使用多線程的風(fēng)險(xiǎn)也相對(duì)較大。會(huì)有很多意想不到的問題。我們必須熟悉這個(gè)概念,并構(gòu)建不同的場(chǎng)景進(jìn)行測(cè)試!