多線程?怎么用?
Java線程:概念與原理
操作系統(tǒng)中線程和進程的概念
現(xiàn)在的操作系統(tǒng)是多任務(wù)操作系統(tǒng)。多線程是實現(xiàn)多任務(wù)的一種方式。
進程是指一個內(nèi)存中運行的應(yīng)用程序,每個進程都有自己獨立的一塊內(nèi)存空間,一個進程中可以啟動多個線程。比如在Windows系統(tǒng)中,一個運行的exe就是一個進程。
線程是指進程中的一個執(zhí)行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬于某個進程,進程中的多個線程共享進程的內(nèi)存。
學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW
進程是系統(tǒng)進行資源分配和調(diào)度的獨立單位,每一個進程都有它自己的內(nèi)存空間和系統(tǒng)資源。進程實現(xiàn)多處理機環(huán)境下的進程調(diào)度,分派,切換時,都需要花費較大的時間和空間開銷。為了提高系統(tǒng)的執(zhí)行效率,減少處理機的空轉(zhuǎn)時間和調(diào)度切換的時間,以及便于系統(tǒng)管理,所以有了線程,線程取代了進程了調(diào)度的基本功能\

使用多線程最主要的原因是提高系統(tǒng)的資源利用率。現(xiàn)在CPU基本都是多核的,如果你只用單線程,那就是只用到了一個核心,其他的核心就相當(dāng)于空閑在那里了\
在平時工作中多線程是隨時都可見的。比如說,我們系統(tǒng)Web服務(wù)器用的是Tomcat,Tomcat處理每一個請求都會從線程連接池里邊用一個線程去處理。又比如說,我們用連接數(shù)據(jù)庫會用對應(yīng)的連接池,比如Druid/C3P0/DBCP
等等,這些都用了多線程的。
學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW
除了上面這些框架已經(jīng)幫我們屏蔽掉「手寫」多線程的問題,在我本身的系統(tǒng)也會用到多線程的。比如說:現(xiàn)在要跑一個定時任務(wù),該任務(wù)的鏈路執(zhí)行時間和過程都非常長,我們這邊就用一個線程池將該定時任務(wù)的請求進行處理,這樣做的好處就是可以及時返回結(jié)果給調(diào)用方,能夠提高系統(tǒng)的吞吐量。
在java中要想實現(xiàn)多線程,有兩種手段,一種是繼續(xù)Thread類,另外一種是實現(xiàn)Runable接口.(其實準(zhǔn)確來講,應(yīng)該有三種,還有一種是實現(xiàn)Callable接口,并與Future、線程池結(jié)合使用,此文這里不講這個。
Java線程的實現(xiàn)形式
這里繼承Thread類的方法是比較常用的一種,如果說你只是想起一條線程。沒有什么其它特殊的要求,那么可以使用Thread.
學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW
繼承Thread類
實現(xiàn)Runnable接口
使用Callable和Future接口創(chuàng)建線程。
main方法其實也是一個線程。在java中所以的線程都是同時啟動的,至于什么時候,哪個先執(zhí)行,完全看誰先得到CPU的資源。
在java中,每次程序運行至少啟動2個線程。一個是main線程,一個是垃圾收集線程。因為每當(dāng)使用java命令執(zhí)行一個類的時候,實際上都會啟動一個JVM,每一個JVM就是在操作系統(tǒng)中啟動了一個進程。
學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW
什么是線程安全
在我的理解下,在Java世界里邊,所謂線程安全就是多個線程去執(zhí)行某類,這個類始終能表現(xiàn)出正確的行為,那么這個類就是線程安全的。比如我有一個count
變量,在service
方法不斷的累加這個count
變量

我個人解決線程安全問題的思路有以下:
能不能保證操作的原子性,考慮atomic包下的類夠不夠我們使用。
能不能保證操作的可見性,考慮
volatile
關(guān)鍵字夠不夠我們使用如果涉及到對線程的控制(比如一次能使用多少個線程,當(dāng)前線程觸發(fā)的條件是否依賴其他線程的結(jié)果),考慮CountDownLatch/Semaphore等等。
如果是集合,考慮
java.util.concurrent
包下的集合類。如果synchronized無法滿足,考慮lock包下的類
....
總的來說,就是先判斷有沒有線程安全問題,如果存在則根據(jù)具體的情況去判斷使用什么方式去處理線程安全的問題。雖然synchronized很牛逼,但無腦使用synchronized會影響我們程序的性能的。
學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW
死鎖了解嗎?什么情況會造成死鎖?
造成死鎖的原因可以簡單概括為:當(dāng)前線程擁有其他線程需要的資源,當(dāng)前線程等待其他線程已擁有的資源,都不放棄自己擁有的資源。避免死鎖的方式一般有以下方案:
固定加鎖的順序“,比如我們可以使用Hash值的大小來確定加鎖的先后
盡可能縮減加鎖的范圍,等到操作共享變量的時候才加鎖。
使用可釋放的定時鎖(一段時間申請不到鎖的權(quán)限了,直接釋放掉)
學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW
作者:狼王編程
鏈接:https://juejin.cn/post/6956489992340242446
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。