1. 程式人生 > >5、Java並發性和多線程-相同線程

5、Java並發性和多線程-相同線程

http 主題 數據位 thread 分片 內部 自己的 .cn 同時

以下內容轉自http://tutorials.jenkov.com/java-concurrency/same-threading.html(使用谷歌翻譯):

相同線程(同一線程)是一種並發模型,其中單線程系統擴展到N個單線程系統。結果是並行運行的N個單線程系統。

同一個線程系統不是一個純粹的單線程系統,因為它包含多個線程。但是,每個線程都像單線程系統一樣運行。

為什麽是單線程系統?

你可能會想知道為什麽有人今天會設計單線程系統。單線程系統得到普及,因為它們的並發模型比多線程系統簡單得多。單線程系統不與其他線程共享任何數據。這使得單線程可以使用非並發數據結構,並更好地利用CPU和CPU緩存。

不幸的是,單線程系統不能充分利用現代CPU。現代CPU通常帶有2個或4個以上的內核。每個核心都可以作為一個單獨的CPU。單線程系統只能使用其中一個核心,如下所示:

技術分享

相同線程,單線程縮放

為了利用CPU中的所有內核,可以擴展單線程系統以利用整個計算機。

每個CPU一個線程

相同線程的系統通常在計算機中每個CPU運行一個線程。如果計算機包含4個CPU或4個內核的CPU,則運行4個同一線程系統(4個單線程系統)的實例是正常的。下圖顯示了這一原則:

技術分享

沒有共享狀態

同一個線程系統看起來類似於多線程系統,因為同一個線程系統在其中運行了多個線程。但有一個微妙的區別。

同線程和多線程系統之間的區別在於同一線程系統中的線程不共享狀態。沒有共享內存,線程同時訪問。沒有並發數據結構等,線程共享數據。這個區別如下所示:

技術分享

缺少共享狀態是每個線程如果是單線程系統的行為。然而,由於同一線程系統可以包含多個線程,因此它不是真正的“單線程系統”。由於缺乏一個更好的名字,我發現更精確地稱這個系統是一個相同的線程系統,而不是一個“單線程設計的多線程系統”。相同線程更容易說明,更容易理解。

相同線程基本上意味著數據處理保持在同一個線程內,並且同一線程系統中的線程不會同時共享數據。

負荷分配

顯然,同一線程系統需要共享運行的單線程實例之間的工作負載。如果沒有,只有一個實例將獲得任何工作,並且該系統實際上將是單線程的。

正確分配負載在不同實例上的方式取決於系統的設計。下面我將介紹幾個。

單線程微服務器

如果你的系統由多個微服務器組成,則每個微服務器都可以以單線程模式運行。當你將多個單線程微服務部署到同一臺機器時,每個微服務器都可以在單個CPU上運行單個線程。

微服務不會自然地共享任何數據,所以微服務是同一線程系統的好例子。

帶有分片數據的服務

如果你的系統實際上需要共享數據,或至少是數據庫,則可以分割數據庫。分片表示數據在多個數據庫之間分配。數據通常被分割,使得彼此相關的所有數據位於同一數據庫中。例如,屬於某個“所有者”實體的所有數據將被插入同一數據庫。分片不在本教程的範圍之內,因此你將不得不搜索有關該主題的教程。

線程通信

如果同一線程中的線程需要進行通信,則通過消息傳遞來實現。想要向線程A發送消息的線程可以通過生成消息(字節序列)來實現。線程B可以復制該消息(字節序列)並讀取它。通過復制消息線程B確保線程A在線程B讀取時線程A無法修改消息。一旦它被復制,它是不可變的線程A.

通過消息傳遞的線程通信如下所示:

技術分享

線程通信可以通過隊列,管道,unix套接字,TCP套接字等進行。無論什麽只要適合你的系統即可。

更簡單的並發模型

在同一線程系統中自己的線程中運行的每個系統都可以像單線程那樣被實現。這意味著內部並發模型比線程共享狀態變得簡單得多。你不必擔心並發數據結構和數據結構可能導致的所有並發問題。

插圖

以下是單線程,多線程和同線程系統的圖示,因此你可以更容易地了解它們之間的區別。

第一個例子顯示了一個單線程系統。

技術分享

第二個例子顯示了線程共享數據的多線程系統。

技術分享

第三個例子顯示了一個具有2個線程的同一線程系統,它們分開數據,通過傳遞消息來進行通信。

技術分享

5、Java並發性和多線程-相同線程