JAVA多線程之四---同一線程化

同線程也是一種併發模型,指的是從單線程系統擴展中出N個單線程系統。 N個單線程在系統中並行運行。同線程不等於單線程,由於,它裏面也包含着多個線程。 只是每一個線程都像單線程那樣運行。數據庫

單線程系統

      可能有人不理解,現現在怎麼還有人設計一個單線程系統。 單線程系統流行,主要是應爲它們的併發模型相對多線程系統來講更加簡單。 單線程系統沒有什麼數據須要和其餘線程共享使用。 這就讓單個線程可使用非併發的數據結構,並且還能夠更好的利用CPU以及CPU內部緩存。可是,單線程系統並不能徹底發揮出現代CPU的能力。現代CPU通常都有2核,4核或者更多內核。每一個內核都是一個獨立的CPU。 單線程系統只能利用一個內核。如圖所示:緩存

image

同線程,單線程擴展

       爲了充分利用CPU中的全部內核,單線程系統能夠進行擴展。數據結構

每一個CPU一個線程

      同線程系統常常是每一個CPU一個線程。 若是計算機有4個CPU,或者CPU有4個內核,那就運行4個相同的「單線程」。如圖所示:多線程

image

沒有共享數據

     同線程系統中運行着多個線程,因此看起來相似一個多線程系統。 可是兩個並不相等。區別就在於同線程系統中沒有共享數據。 共享內存區域沒有併發訪問。沒有併發型數據結構等等。如圖所示:併發

image

沒有共享數據,就可讓每一個線程均可以像單線程系統那樣運轉。 同線程系統中雖然包含更多的線程,但並非「單線程系統」。 這個名字可能並不十分準確,但至少「同線程」(Same-threaded)要比「單線程設計的多線程系統」(multi-threaded system with a single-threaded design)要好不少。同線程主要意味着,數據老是被同一個線程處理。同線程系統中不存在併發數據訪問。socket

負載分配(調度)

    明顯的,在同線程系統中須要在多個單線程實例之間進行負載分配。 若是不進行分配,可能致使全部工做都由一個實例處理,那這樣就成了單線程系統了。如何恰當的調度,主要取決於系統設計。下面會介紹幾種狀況。微服務

單線程微服務

       若是系統由多個微服務構成,每一個微服務能夠以單線程模型來運行。 當在同一個機器上,部署多個單線程的微服務,每一個微服務能夠在一個CPU上運行一個線程。微服務並不共享數據,所以微服務就是一個同線程系統的好例子。spa

帶數據分片的服務

       若是系統避免不了共享數據,如只有一個數據庫,那能夠分片使用數據庫。 分片意味着數據分佈在多個數據庫中。 在分片時把邏輯關聯的數據放在一個數據庫中。對於實例來講,就感受數據都在一個數據庫中。更多關於分片的資料,能夠自行搜索。.net

線程通信

       在同線程模型中,若是線程之間須要通信,會在線程之間進行消息發送。 A線程想要發送消息給B線程,那A線程產生消息,而後B線程能夠複製這個消息並讀取。 經過複製消息,能夠確保線程A不會在線程B讀的時候修改數據。 這就相似不可變數據。如圖所示:線程

image

線程通信還能夠經過隊列,管道,unix sockets套接字,TCP通信等等。

更簡單的併發模型

        每一個系統都已同線程的方式運行,那就能夠以單線程的方式處理。 這就意味着內部併發模型能夠更加簡單。 那就無需擔憂併發數據結構等其餘併發問題了。

示例

單線程系統

image

   多線程系統

image

同線程系統

image

Netty 4 的線程模型其實就是一個同線程系統

 

轉自 https://my.oschina.net/roccn/blog/1362847

相關文章
相關標籤/搜索