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