rust8G内存够不够用_多线程?怎么用?
Java線程:概念與原理
操作系統中線程和進程的概念
現在的操作系統是多任務操作系統。多線程是實現多任務的一種方式。
進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個進程中可以啟動多個線程。比如在Windows系統中,一個運行的exe就是一個進程。
線程是指進程中的一個執行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬于某個進程,進程中的多個線程共享進程的內存。
進程是系統進行資源分配和調度的獨立單位,每一個進程都有它自己的內存空間和系統資源。進程實現多處理機環境下的進程調度,分派,切換時,都需要花費較大的時間和空間開銷。為了提高系統的執行效率,減少處理機的空轉時間和調度切換的時間,以及便于系統管理,所以有了線程,線程取代了進程了調度的基本功能
使用多線程最主要的原因是提高系統的資源利用率。現在CPU基本都是多核的,如果你只用單線程,那就是只用到了一個核心,其他的核心就相當于空閑在那里了
在平時工作中多線程是隨時都可見的。比如說,我們系統Web服務器用的是Tomcat,Tomcat處理每一個請求都會從線程連接池里邊用一個線程去處理。又比如說,我們用連接數據庫會用對應的連接池,比如Druid/C3P0/DBCP等等,這些都用了多線程的。
除了上面這些框架已經幫我們屏蔽掉「手寫」多線程的問題,在我本身的系統也會用到多線程的。比如說:現在要跑一個定時任務,該任務的鏈路執行時間和過程都非常長,我們這邊就用一個線程池將該定時任務的請求進行處理,這樣做的好處就是可以及時返回結果給調用方,能夠提高系統的吞吐量。
在java中要想實現多線程,有兩種手段,一種是繼續Thread類,另外一種是實現Runable接口.(其實準確來講,應該有三種,還有一種是實現Callable接口,并與Future、線程池結合使用,此文這里不講這個。
Java線程的實現形式
這里繼承Thread類的方法是比較常用的一種,如果說你只是想起一條線程。沒有什么其它特殊的要求,那么可以使用Thread.
繼承Thread類
實現Runnable接口
使用Callable和Future接口創建線程。
main方法其實也是一個線程。在java中所以的線程都是同時啟動的,至于什么時候,哪個先執行,完全看誰先得到CPU的資源。
在java中,每次程序運行至少啟動2個線程。一個是main線程,一個是垃圾收集線程。因為每當使用java命令執行一個類的時候,實際上都會啟動一個JVM,每一個JVM就是在操作系統中啟動了一個進程。
什么是線程安全
在我的理解下,在Java世界里邊,所謂線程安全就是多個線程去執行某類,這個類始終能表現出正確的行為,那么這個類就是線程安全的。比如我有一個count變量,在service方法不斷的累加這個count變量
public class UnsafeCountingServlet extends GenericServlet implements Servlet {
private long count = 0;
public long getCount() {
return count;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
++count;
// To something else...
}
}
我個人解決線程安全問題的思路有以下:
- 能不能保證操作的原子性,考慮atomic包下的類夠不夠我們使用。
- 能不能保證操作的可見性,考慮volatile關鍵字夠不夠我們使用
- 如果涉及到對線程的控制(比如一次能使用多少個線程,當前線程觸發的條件是否依賴其他線程的結果),考慮CountDownLatch/Semaphore等等。
- 如果是集合,考慮java.util.concurrent包下的集合類。
- 如果synchronized無法滿足,考慮lock包下的類
- ....
總的來說,就是先判斷有沒有線程安全問題,如果存在則根據具體的情況去判斷使用什么方式去處理線程安全的問題。雖然synchronized很牛逼,但無腦使用synchronized會影響我們程序的性能的。
死鎖了解嗎?什么情況會造成死鎖?
造成死鎖的原因可以簡單概括為:當前線程擁有其他線程需要的資源,當前線程等待其他線程已擁有的資源,都不放棄自己擁有的資源。避免死鎖的方式一般有以下方案:
- 固定加鎖的順序“,比如我們可以使用Hash值的大小來確定加鎖的先后
- 盡可能縮減加鎖的范圍,等到操作共享變量的時候才加鎖。
- 使用可釋放的定時鎖(一段時間申請不到鎖的權限了,直接釋放掉)
總結
以上是生活随笔為你收集整理的rust8G内存够不够用_多线程?怎么用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用sisotool设计调节参数_工业净化
- 下一篇: 毛丹水果多少钱一斤