happens-before規則、調度器、進程同步、進程異步、進程互斥、互斥鎖、死鎖

happens-before。

happens-before字面翻譯過來就是先行發生,A happens-before B 就是A先行發生於B?

不準確!在Java內存模型中,happens-before 應該翻譯成:並不是說前一個操作必須要在後一個操作之前執行,而是指前一個操作的執行結果必須對後一個操作可見。講白點就是前面一個操作把變量a賦值爲1,那後面一個操作肯定能知道a已經變成了1。

什麼是調度器(scheduler)?調度器的作用是什麼?

調度器是一個操作系統的核心部分。可以比作是CPU時間的管理員。調度器主要負責選擇某些就緒的進程來執行。不同的調度器根據不同的方法挑選出最適合運行的進程

進程同步

不是生活中的同步 而是 按照預定的先後次序進行運行 。比如:你先說,我再說。

"同"字從字面上容易理解爲一起動作,其實不是,"同"字應是指協同、協助、互相配合。

如進程 、線程同步,可理解爲進程或者線程A和B一塊配合,A執行到一定程序時需要依賴B的某個結果,於是停下來,示意B運行;B執行,再將結果給A;A再繼續操作。

進程異步

進程的異步性,進程以人們不可預知的速度向 前推進。

進程互斥

兩個或兩個以上的進程,不能同時進入關於同一組共享變量的臨界區域,否則可能發生與時間有關的錯誤,這種現象被稱作進程互斥· 也就是說,一個進程正在訪問臨界資源,另一個要訪問該資源的進程必須等待。

簡單總結:

互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。  

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

 

互斥鎖

當多個線程幾乎同時修改某一個共享數據的時候,需要進行同步控制
線程同步能夠保證多個線程安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。
互斥鎖爲資源引入一個狀態:鎖定/非鎖定

實現原理:某個線程要更改共享數據時,先將其鎖定,此時資源的狀態爲“鎖定”,其他線程不能更改;直到該線程釋放資源,將資源的狀態變成“非鎖定”,其他的線程才能再次鎖定該資源。互斥鎖保證了每次只有一個線程進行寫入操作,從而保證了多線程情況下數據的正確性。

死鎖

在線程間共享多個資源的時候,如果兩個線程分別佔有一部分資源並且同時等待對方的資源,就會造成死鎖。儘管死鎖很少發生,但一旦發生就會造成應用的停止響應。

鎖的總結

鎖的好處:

確保了某段關鍵代碼只能由一個線程從頭到尾完整地執行

鎖的壞處:

阻止了多線程併發執行,包含鎖的某段代碼實際上只能以單線程模式執行,效率就大大地下降了
由於可以存在多個鎖,不同的線程持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖


參考:https://www.jianshu.com/p/ba19fec28867

           https://blog.csdn.net/ns_code/article/details/17284351 

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