1、Java併發編程基礎概念

1、進程與線程

進程:
  進程是操作系統結構的基礎,是程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位。
線程:
  線程可以理解爲是進程中獨立運行的子任務

進程與線程的聯繫與區別:

  • 一個程序的運行至少包含一個進程,一個進程至少有一個線程
  • 線程的劃分尺度要小於進程,使得多線程的併發性高
  • 進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大的提高了程序的運行效率

2、線程安全

  線程安全就是多個線程訪問同一個類,不管運行時環境採用何種調度方式或者這些線程如何交替運行,並且在主調代碼中不需要任何額外的同步或協同,這個類都能表現出正確的行爲,那麼就程這個類是線程安全的。

3、同步和異步

同步和異步是針對方法調用而言的
同步是指方法調用會等待方法返回,方法返回後才能繼續往下執行。
異步是指方法調用會立即返回,並繼續向下執行,但是異步調用立即返回並不表示這個調用請求處理完成,而是會在後臺起一個線程去執行。

4、並行與併發

併發:多個線程搶佔同一CPU時間片
並行:不同的CPU同時執行不同的線程

5、臨界區

臨界區用來表示一種公共資源。可以被多線程使用,但是一次只能一個線程使用它,一旦臨界區被佔用,其他線程要想使用臨界區資源,則只能進入阻塞等待隊列。

6、阻塞與非阻塞

阻塞和非阻塞通常用來形容多線程間的相互影響。
如果一個線程佔用了臨界區資源,那麼其他所有需要這個資源的線程就會在這個臨界區的阻塞隊列中等待,等待就會導致線程掛起,導致阻塞。如果佔用這個臨界區資源的線程一直不釋放資源,那麼所有阻塞在這個臨界區的線程都不能進行工作。
而非阻塞是多個線程同時進入臨界區。

7、死鎖

死鎖是指兩個或者多個線程相互持有對方需要的資源,導致這些線程處於等待狀態,無法繼續前行
死鎖產生的必要條件:

  • 互持條件:一個資源只能被一個進程佔用
  • 請求和保持條件:一個進程因請求被佔用的資源發生阻塞時,對已獲得資源保持不放
  • 不剝奪條件:任何一個資源在沒被該進程釋放之前,任何其他線程都無法對他剝奪佔用
  • 循環等待條件:當發生死鎖時,所等待的資源必然會形成一個環路。造成永久阻塞。

避免死鎖的幾個方式:

  1. 避免一個線程同時獲取多個鎖
  2. 避免一個鎖內同時佔用多個資源,儘量保證每一個鎖只佔用一個資源
  3. 嘗試使用定時鎖,lock.tryLock(timeout)來替代使用內部鎖機制
  4. 對於數據庫鎖,加索和解鎖必須在一個數據庫鏈接裏,否則會導致解鎖失敗
8、飢餓

某些線程於其他線程搶佔CPU時間片時,總是沒有搶佔到CPU時間片,就會使線程處於飢餓狀態

9、活鎖

與死鎖相反,活鎖是過度的釋放CPU資源,都不去搶佔資源,導致線程阻塞

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