什麼是使用者態和核心態
在作業系統裡面,作業系統的核心佔一部分記憶體,使用者應用程式佔一部分記憶體,核心即可以訪問自身的記憶體,
也可以訪問使用者應用程式的記憶體,但是使用者應用程式只能訪問自身的記憶體,不能訪問核心的記憶體
執行緒的啟動、關閉、切換都要依賴於核心態
voliate
保證執行緒可見性
禁止指令重排序
執行緒安全的單例
object object = new object();
變數本質上對應乙個位址,此位址根據資料型別儲存相應的值
jvm建立乙個物件分為三步:
1.為物件申請記憶體
2.給這個物件的成員變數賦零值
3.把記憶體的位址賦值給變數
如果不禁止指令重排序,那麼有可能第2步有可能發生在第3步之後,即申請完記憶體,就把記憶體的位址賦值給了變數,
然後再去給成員變數初始化。在多執行緒環境下,若有其他的執行緒在第2步還沒發生就拿到了這個物件,則會發生執行緒
安全問題
鎖優化:
鎖細化:盡量減小加鎖**的範圍
鎖粗化:鎖爭用特別頻繁的時候。例如一段**中有大量細化的鎖,不如粗化來處理
鎖定物件object,如果object的屬性發生改變,不影響鎖的使用,但是如果object被改變為另外的乙個物件,則鎖定的
物件發生改變,應該避免將鎖定物件的引用變為另外的物件,使用final關鍵字來實現
原子類:atom***,內部使用cas(compare and set)實現
*/cas(value, excepted, newvalue)
otherwise try again or fail
}cas是cpu指令級別的支援,中間不能被打斷
aba問題:在cas操作的過程中,值發生改變,但又回到了期望的值
aba產生的問題:如果是基礎型別,沒有影響;如果是引用型別,因為位址沒有改變,物件內部發生改變,
將會引發邏輯問題
unsafe類,cas的實現依賴於unsafe類
多執行緒02 執行緒建立
1 方式一 繼承 thread 類,重寫run 方法,呼叫start 開啟執行緒 public class thread01 extends thread main 是主線程 public static void main string args throws interruptedexceptio...
Python 多執行緒 (02)
當多個執行緒同時訪問乙個變數的時候,會產生共享變數的問題。問題解決 鎖 是乙個標誌,表示乙個執行緒正在占用一些資源 訊號燈 鎖的使用方法 上鎖,使用共享資源,放心的用,取消鎖,釋放鎖。案例1import threading sum 0 loopsum 1000000 lock threading.l...
Python 多執行緒學習02
這一次的目的是,兩個執行緒以方式合作,列印0 9的十個數字。不要漏,也不要重複。於是在上乙個程式的基礎上,修改一下,因為數字都存在content這個列表中,每次乙個執行緒先pop 出乙個數字,再列印,這樣,每個數字就只能被列印一次了。效果怎樣呢?試試吧。修改後的程式為 coding utf8 imp...