線程安全:若是一個對象能夠安全的被多個線程同時使用,那它就是線程安全的。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. 偏向鎖
在無競爭的狀況下把整個同步都消除掉。