行程與執行緒
行程,程式的一次執行程序,系統運行程式的基本單位,
啟動main函式,即啟動JVM的一個行程,mian函式為其主執行緒,
同類多個執行緒共享行程的堆和方法區資源,切換作業負擔比行程小,
一個Java程式的運行時main執行緒和多個其他執行緒同時運行,
各個行程是獨立的,但各個執行緒不一定,同一行程中執行緒會相互影響,執行緒執行開銷小,但不利于資源的管理和保護,
執行緒私有:PC,虛擬機堆疊,本地方法堆疊
PC:改變PC讀取指令,實作代碼流程控制(位元組碼解釋器);記錄當前執行緒執行的位置(多執行緒)
native方法,記錄undefined地址,Java代碼,下一條指令的地址
PC執行緒私有,便于執行緒切換后恢復到正確位置
虛擬機堆疊:Java方法,堆疊幀在虛擬機堆疊出入堆疊
本地方法堆疊:Native方法,本地方法堆疊初入堆疊
保證執行緒中區域變數不被其他執行緒訪問
堆和方法去(執行緒共享):
堆:存放新創建物件;方法區;存放類資訊等
多執行緒好處:
執行緒切換和調度成本低,減少了背景關系切換的開銷;多個同類執行緒之間的資源競爭較小,任務執行效率提高
多執行緒帶來的問題:
前文所講,執行緒執行開銷小,但不利于資源的管理和保護,記憶體泄漏,死鎖,執行緒不安全(之后可詳細討論)
執行緒生命周期和狀態:
只有六種,NEW,RUNNABLE,BLOCKED,WAITING,TIME_WAITING,TERMINATED,記憶時可以根據英文名稱記憶
注意區分阻塞狀態和等待狀態,
RUNNABLE狀態中包括運行中與就緒狀態,當就緒狀態的執行緒獲得時間片后變稱為運行狀態(因時間分片粒度很小,因此不做狀態區分了,
等待狀態的執行緒需要依靠其他執行緒的通知才能夠回傳運行態,而超時等待的執行緒超過設定的時間后會自行回傳到RUNNABLE狀態;阻塞狀態與鎖有關,鎖也是JAVA并發中的難點重點,后文會提及,
背景關系切換:
背景關系:執行緒執行程序中的運行條件和狀態(PC,堆疊資訊等)
執行緒切換背景關系時需保留當前執行緒的背景關系(當執行緒下次占用CPU時恢復現場),加載下一個將要占用CPU的執行緒的背景關系
保存資訊回復資訊會占用CPU和記憶體資源,影響效率
執行緒死鎖:
多個執行緒同時被阻塞,等待資源的釋放,且占據著他們持有的資源(資源只能被一個執行緒占用)不釋放(別的執行緒無法強行剝奪),形成了一種回圈等待資源的關系
預防避免執行緒死鎖:
破壞執行緒死鎖的條件(一次性申請所有資源,主動釋放占有的資源,按照某一順序申請資源(銀行家演算法))
Java中的鎖和監視器:
一直看到很多關于鎖和監視器的字眼,這次好好了解一下,
- Synchronization is built around an internal entity known as the intrinsic lock or monitor lock. (The API specification often refers to this entity simply as a "monitor.")
- Every object has an intrinsic lock associated with it. By convention, a thread has to acquire the object's monitor lock before accessing them, and then release the monitor lock when it's done with them. A thread is said to own the lock between the time it has acquired the lock and released the lock. As long as a thread owns a monitor lock, no other thread can acquire the same lock. The other thread will block when it attempts to acquire the lock.
- When a thread releases the lock, a happens-before relationship is established between that action and any subsequent acquisition of the same lock.
翻譯:
同步(synchronized)是圍繞一個內部物體建立的,被稱為內在鎖或監控鎖,(API規范經常把這個物體簡單地稱為 "監視器"),
每個物件都有一個與之相關的內在鎖,按照慣例,一個執行緒在訪問物件之前必須獲得物件的監控鎖,然后在使用完后釋放監控鎖,一個執行緒在獲得鎖和釋放鎖這段時間內被稱為擁有該鎖,只要一個執行緒擁有一個監控鎖,其他執行緒就不能獲得相同的鎖,當其他執行緒試圖獲取該鎖時,它將阻塞,
當一個執行緒釋放鎖的時候,在這個動作和任何后續的相同鎖的獲取之間建立了一個發生在之前的關系,
這是官方檔案里面的,但還是有些晦澀,我沒太看懂
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546530.html
標籤:其他
下一篇:【牛客】8 企業真題
