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