簡單談談線程

進程與線程?

多任務:同一時刻運行多個程序的能力。每一個任務稱爲一個線程。可以同時運行一個以上線程的程序稱爲多線程程序。
Java編寫程序都運行在在Java虛擬機(JVM)中,在JVM的內部,程序的多任務是通過線程來實現的。每用java命令啓動一個java應用程序,就會啓動一個JVM進程。在同一個JVM進程中,有且只有一個進程,就是它自己。在這個JVM環境中,所有程序代碼的運行都是以線程來運行。  
一般常見的方法,這樣就產生了一個線程,這個線程稱之爲主線程。當main方法結束後,主線程運行完成。JVM進程也隨即退出。  
對於一個進程中的多個線程來說,多個線程共享進程的內存塊,當有新的線程產生的時候,操作系統不分配新的內存,而是讓新線程共享原有的進程塊的內存。因此,線程間的通信很容易,速度也很快。不同的進程因爲處於不同的內存塊,因此進程之間的通信相對困難。  
進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個進程中可以啓動多個線程。比如在Windows系統中,一個運行的exe就是一個進程。  
線程是指進程中的一個執行流程,一個進程可以運行多個線程。比如java.exe進程可以運行很多線程。線程總是輸入某個進程,進程中的多個線程共享進程的內存。

Java中線程是指java.lang.Thread類的一個實例或線程的執行。使用java.lang.Thread或java.lang.Runnable接口編寫代碼定義、實例化、啓動新線程。方法運行在一個線程內,稱爲主線程。一旦創建一個新的線程,就產生一個新的調用棧。  
線程分爲兩類:用戶線程和守候線程。當所有用戶線程執行完畢後,JVM自動關閉。但是守候線程卻不獨立與JVM,守候線程一般是有操作系統或用戶自己創建的。

什麼是線程?

什麼是線程按操作系統中的描述,線程是 CPU 調度的最小單元,直觀來說線程就是代碼按順序執行下來,執行完畢就結束的一條線。
舉個 ?,富土康的一個組裝車間相當於 CPU ,而線程就是當前車間裏的一條條作業流水線。爲了提高產能和效率,車間裏一般都會有多條流水線同時作業。比如在Android 開發中多線程可以說是隨處可見了,如執行耗時操作,網絡請求、文件讀寫、數據庫讀寫等等都會開單獨的子線程來執行。

多線程環境中的一些概念?

併發必須知道的概念在深入學習併發編程之前,我們需要了解幾個基本的概念。
一、同步和異步
(1)、同步:可以理解爲發出一個請求後,必須等待返回結果才能執行下面的操作。
(2)、異步:請求發出後,不需要等待返回結果,可以繼續執行後續操作,異步請求更像是在另一個 “空間” 中處理請求的結果,這個過程不會影響請求方的其他操作。

同步:舉個生活中的例子,比如我們去實體店買衣服,挑選完款式後下單讓售貨員去倉庫拿貨,在售貨員拿貨的過程你需要在店裏等待,直到售貨員把衣服交給你後纔算購物成功,這就相當於同步的過程。
異步:網上購物,我們只需下單並完成支付,對我們來說整個購物過程就算完成了。網上的商家接到訂單會幫我們加緊安排送貨,這段時間我們可以去做其他的事,比如去外面打個籃球之類的。等送貨上門並簽收商品就完事了,這個過程就相當於異步。

二、併發和並行
併發和並行併發和並行的功能很相似,兩者都可以表示多個任務一起執行的情況,但本質上兩者其實是有區別的。
嚴格意義上來說,並行的多任務是真實的同時執行,而併發更多的情況是任務之間交替執行,系統不停的在多個任務間切換執行,也就是 “串行” 執行。
最直接的例子的就是我們的計算機系統,在單核CPU時代,系統表面上能同時進行多任務處理,比如聽歌的同時又瀏覽網頁,但真實環境中這些任務不可能是真實並行的,因爲一個CPU一次只能執行一條指令,這種情況就是併發,系統看似能處理多任務是因爲不停的切換任務,但因爲時間非常短,所以在我們的感官來說就是同時進行的。而計算機系統真實的並行是隨着多核CPU的出現纔有的。
三、臨界區
臨界區表示公共資源或是共享數據,可以被多個線程使用。但是每次只能有一個線程使用它,一旦臨界區的資源被佔用,其他線程就必須等到資源釋放後才能繼續使用該資源。在Java程序開發中,對於這樣的資源一般都需要做同步的操作

什麼是線程安全?

首先“線程安全”指的不是指線程的安全,而是指內存的安全。爲什麼如此說呢?這和操作系統有關。
目前主流操作系統都是多任務的,即多個進程同時運行。爲了保證安全,每個進程只能訪問分配給自己的內存空間,而不能訪問別的進程的,這是由操作系統保障的。
在每個進程的內存空間中都會有一塊特殊的公共區域,通常稱爲堆(內存)。進程內的所有線程都可以訪問到該區域,這就是造成問題的潛在原因。(java的JVM虛擬機中內存分爲堆內存和棧內存)
假設某個線程把數據處理到一半,覺得很累,就去休息了一會,回來準備接着處理,卻發現數據已經被修改了,不是自己離開時的樣子了。可能被其它線程修改了。
比如把你住的小區看作一個進程,小區裏的道路/綠化等就屬於公共區域,你就是一個線程。你拿1萬塊錢往地上一扔,就回家睡覺去了。睡醒後你打算去把它撿回來,發現錢已經不見了。可能被別人拿走了。
因爲公共區域人來人往,你放的東西在沒有看管措施時,一定是不安全的。內存中的情況亦然如此。

所以線程安全指的是,在堆內存中的數據由於可以被任何線程訪問到,在沒有限制的情況下存在被意外修改的風險。即堆內存空間在沒有保護機制的情況下,對多線程來說是不安全的地方,因爲你放進去的數據,可能被別的線程“破壞”
下一遍博客會談談如何保證線程安全。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章