多線程

1.鎖的happens-before規則保證釋放鎖和獲取鎖的兩個線程之間的內存可見性,這意味着對
一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最後的寫入。

2.鎖分爲悲觀鎖和樂觀鎖,悲觀鎖的代表是synochrnized,樂觀鎖包含偏向鎖(通過消除資源無競爭情況下的同步原語,進一步提高了程序的運行性能),輕量鎖,自旋鎖,這些樂觀鎖的實現原理是CAS

3.Synchronized是非公平鎖。Synchronized在線程進入ContentionList時,等待的線程會先嚐試自旋獲取鎖,如果獲取不到就進入ContentionList,這明顯對於已經進入隊列的線程是不公平的,還有一個不公平的事情就是自旋獲取鎖的線程還可能直接搶佔OnDeck線程的鎖資源。

4.鎖優化方案

減少鎖的時間

不需要同步執行的代碼,能不放在同步快裏面執行就不要放在同步快內,可以讓鎖儘快釋放;

減少鎖的粒度

它的思想是將物理上的一個鎖,拆成邏輯上的多個鎖,增加並行度,從而降低鎖競爭。它的思想也是用空間來換時間;

5.

輕量鎖與偏向鎖不同的是:

  1. 輕量級鎖每次退出同步塊都需要釋放鎖,而偏向鎖是在競爭發生時才釋放鎖
  2. 每次進入退出同步塊都需要CAS更新對象頭
  3. 爭奪輕量級鎖失敗時,自旋嘗試搶佔鎖

6.原子操作的界定

CPU最小的執行單元是指令,一個指令週期可能包括多個總線週期。
我們可以得到:
1. 在單處理器下,一個操作只包括一個cpu指令可以保證是原子操作。如果一個操作包含多個cpu指令不是原子操作。
2. 在多處理器下,由於一個cpu指令週期可能包含多個總線週期,就有可能出現其他處理器在一個指令執行期間訪問了其相關的狀態。因此,多處理器下,指令執行期間還必須鎖總線,才能保證CPU指令的原子性

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