Java高併發多線性學習(一)

高併發解決思路與手段

在這裏插入圖片描述
在線下的時候,同一時間自己本地測試沒有問題,而一旦上線,面臨着併發的情況,就會出現了各種各樣的問題了。在這種情況下,就該思考在併發情況下我們該如何編碼,才能得到我們想要的正確的結果。

基本概念

併發: 同時擁有兩個或者多個線程,如果程序在單核處理器上運行,多個線程將交替的換入或者換出內存,這些線程是同時"存在"的,每個線程都處於執行過程中的某個狀態,如果運行在多核處理器上,此時,程序中的每個線程都將分配到一個處理器核上,因此,可以同時運行。
併發情況的關注點在多個線程操作相同的資源時,如何保證線程安全,合理使用和分配資源!
高併發(High Concurrency): 高併發是互聯網分佈式系統架構設計中必須考慮的因素之一,它通常指,通過設計保證系統能夠同時並行處理很多請求。
高併發指的是在短時間內出現的大量的請求,如雙十一的搶購,以及12306的搶票,服務能夠處理很多請求,提高程序性能。如果處理不好高併發,可能導致用戶的請求時間過長,影響用戶體驗,也可能導致宕機!

CPU多級緩存

在這裏插入圖片描述
爲什麼需要CPU cache: 因爲CPU的 頻率太快了,快到主存跟不上,這樣在處理器時鐘週期內,CPU常常需要等待主存,浪費資源。所以cache的出現是爲了緩解CPU和內存之間速度的不匹配問題(結構:cpu-> cache -> memory)
CPU cache的意義:

  • 時間局部性: 如果某個數據被訪問,那麼在不久的將來它很可能被再次訪問
  • 空間局部性: 如果某個數據被訪問,那麼與它相鄰的數據很快也可能被訪問

CPU多級緩存 — 緩存一致性(MESI)

  • 爲了保證多個CPU cache 之間緩存共享數據的一致
    在這裏插入圖片描述

CPU多級緩存 — 亂序執行優化
亂序優化指的是處理器爲了提高運算速度而做出違背代碼原有順序的優化

Java內存模型(Java Memory Model, JMM)

Java內存模型規範了Java虛擬機和計算機內存是如何協同工作的,它規定了一個線程是如何和何時可以看到其他線程修改過的共享變量的值,以及在必須時如何同步的訪問共享變量。
Java內存模型(圖片來源於網絡)
堆是運行時的數據區,它是由垃圾回收來負責的,堆的優勢是可以動態的分配內存大小,生存期也不必告訴編譯器,因爲它是在運行時動態分配內存的,Java的垃圾收集器可以動態的收集這些不要的數據。缺點是在運行的時候動態分配內存,存取速度比較慢。
棧的存取速度比堆要快,僅次於寄存器,棧的數據是可以共享的,缺點是存放的數據大小都是確定的,缺乏一些靈活性,棧中主要存放一些基本類型的變量,比如小寫的int,short,byte,long,float,double,boolean,char等。引用存放棧內,它引用的對象放在堆裏。
如果兩個線程同時調用了一個對象,如圖中兩個L2同時調用了Object3的同一個方法,他們都會訪問這個對象的成員變量,但是這兩個線程都擁有這個對象的私有拷貝
計算機硬件架構的簡單圖示(圖片來源於網絡)
java內存模型和硬件架構之間的關聯
在這裏插入圖片描述

Java內存模型—同步的八種操作

  • Lock(鎖定): 作用於主內存的變量,把一個變量標識爲一條線程獨佔狀態
  • unlock(解鎖): 作用於主內存的變量,把一個處於鎖定狀態的變量釋放出來,釋放後的變量纔可以被其他線程鎖定。
  • read(讀取): 作用於主內存的變量,把一個變量值從主內存傳輸到線程的工作內存中,以便隨後的load動作使用。
  • load(載入): 作用於工作內存的變量,它把read操作從主內存中得到的變量值放入工作內存的變量副本中。
  • use(使用): 作用於工作內存的變量,把工作內存中的一個變量值傳遞給執行引擎
  • assign(賦值): 作用於工作內存的變量,它把一個從執行引擎接收到的值賦值給工作內存的變量
  • store(存儲): 作用於工作內存的變量,把工作內存中的一個變量的值傳遞到主內存中,以便隨後的Write操作
  • write(寫入): 作用於主內存的變量,它把Store操作從工作內存中一個變量的值傳送到主內存中的變量中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章