單CPU:時間切片
多核多線程CPU:真正的并行
??? 如果一個線程在讀一個內(nèi)存時,另一個線程正向該內(nèi)存進(jìn)行寫操作,那進(jìn)行讀操作的那個線程將獲得什么結(jié)果呢?是寫操作之前舊的值?還是寫操作成功之后的新值?或是一半新一半舊的值?或者,如果是兩個線程同時寫同一個內(nèi)存,在操作完成后將會是什么結(jié)果呢?是第一個線程寫入的值?還是第二個線程寫入的值?還是兩個線程寫入的一個混合值?因此如沒有合適的預(yù)防措施,任何結(jié)果都是可能的。而且這種行為的發(fā)生甚至不能預(yù)測,所以結(jié)果也是不確定性的。
在并發(fā)編程中,有兩個基本的執(zhí)行單元:進(jìn)程和線程。在java語言中,并發(fā)編程最關(guān)心的是線程,然而,進(jìn)程也是非常重要的。
即使在只有單一的執(zhí)行核心的計算機(jī)系統(tǒng)中,也有許多活動的進(jìn)程和線程。因此,在任何給定的時刻,只有一個線程在實際執(zhí)行。處理器的處理時間是通過操作系統(tǒng)的時間片在進(jìn)程和線程中共享的。
現(xiàn)在具有多處理器或有多個執(zhí)行內(nèi)核的多處理器的計算機(jī)系統(tǒng)越來越普遍,這大大增強(qiáng)了系統(tǒng)并發(fā)執(zhí)行的進(jìn)程和線程的吞吐量–但在不沒有多個處理器或執(zhí)行內(nèi)核的簡單的系統(tǒng)中,并發(fā)任然是可能的。
進(jìn)程
進(jìn)程具有一個獨立的執(zhí)行環(huán)境。通常情況下,進(jìn)程擁有一個完整的、私有的基本運行資源集合。特別地,每個進(jìn)程都有自己的內(nèi)存空間。
進(jìn)程往往被看作是程序或應(yīng)用的代名詞,然而,用戶看到的一個單獨的應(yīng)用程序?qū)嶋H上可能是一組相互協(xié)作的進(jìn)程集合。為了便于進(jìn)程之間的通信,大多數(shù)操作系統(tǒng)都支持進(jìn)程間通信(IPC),如pipes 和sockets。IPC不僅支持同一系統(tǒng)上的通信,也支持不同的系統(tǒng)。
Java虛擬機(jī)的大多數(shù)實現(xiàn)是單進(jìn)程的。Java應(yīng)用可以使用的ProcessBuilder對象創(chuàng)建額外的進(jìn)程,多進(jìn)程應(yīng)用超出了本課的范圍。
線程
線程有時也被稱為輕量級的進(jìn)程。進(jìn)程和線程都提供了一個執(zhí)行環(huán)境,但創(chuàng)建一個新的線程比創(chuàng)建一個新的進(jìn)程需要的資源要少。
線程是在進(jìn)程中存在的 — 每個進(jìn)程最少有一個線程。線程共享進(jìn)程的資源,包括內(nèi)存和打開的文件。這樣提高了效率,但潛在的問題就是線程間的通信。
多線程的執(zhí)行是Java平臺的一個基本特征。每個應(yīng)用都至少有一個線程 – 或幾個,如果算上“系統(tǒng)”線程的話,比如內(nèi)存管理和信號處理等。但是從程序員的角度來看,啟動的只有一個線程,叫主線程。這個線程有能力創(chuàng)建額外的線程,
多核多線程CPU:真正的并行
??? 如果一個線程在讀一個內(nèi)存時,另一個線程正向該內(nèi)存進(jìn)行寫操作,那進(jìn)行讀操作的那個線程將獲得什么結(jié)果呢?是寫操作之前舊的值?還是寫操作成功之后的新值?或是一半新一半舊的值?或者,如果是兩個線程同時寫同一個內(nèi)存,在操作完成后將會是什么結(jié)果呢?是第一個線程寫入的值?還是第二個線程寫入的值?還是兩個線程寫入的一個混合值?因此如沒有合適的預(yù)防措施,任何結(jié)果都是可能的。而且這種行為的發(fā)生甚至不能預(yù)測,所以結(jié)果也是不確定性的。

在并發(fā)編程中,有兩個基本的執(zhí)行單元:進(jìn)程和線程。在java語言中,并發(fā)編程最關(guān)心的是線程,然而,進(jìn)程也是非常重要的。
即使在只有單一的執(zhí)行核心的計算機(jī)系統(tǒng)中,也有許多活動的進(jìn)程和線程。因此,在任何給定的時刻,只有一個線程在實際執(zhí)行。處理器的處理時間是通過操作系統(tǒng)的時間片在進(jìn)程和線程中共享的。
現(xiàn)在具有多處理器或有多個執(zhí)行內(nèi)核的多處理器的計算機(jī)系統(tǒng)越來越普遍,這大大增強(qiáng)了系統(tǒng)并發(fā)執(zhí)行的進(jìn)程和線程的吞吐量–但在不沒有多個處理器或執(zhí)行內(nèi)核的簡單的系統(tǒng)中,并發(fā)任然是可能的。
進(jìn)程
進(jìn)程具有一個獨立的執(zhí)行環(huán)境。通常情況下,進(jìn)程擁有一個完整的、私有的基本運行資源集合。特別地,每個進(jìn)程都有自己的內(nèi)存空間。
進(jìn)程往往被看作是程序或應(yīng)用的代名詞,然而,用戶看到的一個單獨的應(yīng)用程序?qū)嶋H上可能是一組相互協(xié)作的進(jìn)程集合。為了便于進(jìn)程之間的通信,大多數(shù)操作系統(tǒng)都支持進(jìn)程間通信(IPC),如pipes 和sockets。IPC不僅支持同一系統(tǒng)上的通信,也支持不同的系統(tǒng)。
Java虛擬機(jī)的大多數(shù)實現(xiàn)是單進(jìn)程的。Java應(yīng)用可以使用的ProcessBuilder對象創(chuàng)建額外的進(jìn)程,多進(jìn)程應(yīng)用超出了本課的范圍。
線程
線程有時也被稱為輕量級的進(jìn)程。進(jìn)程和線程都提供了一個執(zhí)行環(huán)境,但創(chuàng)建一個新的線程比創(chuàng)建一個新的進(jìn)程需要的資源要少。
線程是在進(jìn)程中存在的 — 每個進(jìn)程最少有一個線程。線程共享進(jìn)程的資源,包括內(nèi)存和打開的文件。這樣提高了效率,但潛在的問題就是線程間的通信。
多線程的執(zhí)行是Java平臺的一個基本特征。每個應(yīng)用都至少有一個線程 – 或幾個,如果算上“系統(tǒng)”線程的話,比如內(nèi)存管理和信號處理等。但是從程序員的角度來看,啟動的只有一個線程,叫主線程。這個線程有能力創(chuàng)建額外的線程,
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
