深刻理解JAVA虛擬機閱讀筆記6——線程安全與鎖優化

線程安全:若是一個對象能夠安全的被多個線程同時使用,那它就是線程安全的java

1、Java中的線程安全

1.不可變安全

  不可變的對象必定是線程安全的。String、枚舉類型、java.lang.Number的部分子類如Long和Double等數值包裝類型,BigInteger和BigDecimal等大數據類型。併發

  AtomicInteger和AtomicLong並不是是不可變的。大數據

2.絕對線程安全優化

  如Vector類是線程安全的,可是若是多個線程同時對Vector數據進行增長或者減小,那麼Vector線程不是絕對線程安全的。spa

3.相對線程安全操作系統

  單獨操做是線程安全的,連續操做需考慮同步問題。線程

4. 線程兼容對象

5. 線程獨立ci

2、線程安全的實現方法

1. 互斥同步(阻塞同步)

基本概念:

  同步是指在多個線程併發訪問共享數據時,保證共享數據在同一個時刻只被一個(或者一些)線程使用。

  互斥是實現同步的一種手段,臨界區(Critical Section)、互斥量(Mutex)和信號量(Semaphore)都是互斥實現方式。

  互斥是因,同步是果;互斥是方法,同步是目的。

實現方法:

  synchronized對同一線程可重入,對不一樣線程阻塞。由於java線程是使用操做系統的原生線程實現的,所以synchronized是一個重量級操做。

  ReentrantLock重入鎖。

  • 等待可中斷
  • 可實現公平鎖
  • 鎖能夠綁定多個條件

2. 非阻塞同步

  互斥同步是一種悲觀鎖,老是假定不去同步確定會出問題。

  非阻塞同步是一種樂觀鎖,是基於衝突檢測的方法,先進行操做,若是產生了衝突,重試。

  產生「ABA」問題。

3. 無同步問題

  可衝入代碼

  線程本地存儲

3、鎖優化

1. 自旋鎖和自適應自旋鎖

  由於線程切換是一個重量級的操做,因此對於多處理器來講。若是線程被阻塞,那麼會先執行一個忙循環(自旋操做)。

  自適應自旋轉鎖:自旋的次數會根據 自旋操做是否成功獲取過鎖來 自適應調節下次自旋次數。

2. 鎖消除

  鎖消除是指虛擬機即時編譯器在運行時,對要求同步的代碼,檢測到不可能存在共享數據競爭的鎖進行消除。

3. 鎖粗化

  對一系列連續操做都是同一個對象反覆加鎖解鎖的狀況,將鎖範圍擴大到整個操做系列之外。

4. 輕量級鎖

  在無競爭的狀況下使用CAS操做去消除同步使用的互斥量。

5. 偏向鎖

  在無競爭的狀況下把整個同步都消除掉。

相關文章
相關標籤/搜索