Java透過程式碼模擬高併發可以以最快的方式發現我們系統中潛在的執行緒安全性問題,此處使用Semaphore(訊號量)和 CountDownLatch(閉鎖)搭配ExecutorService(執行緒池)來進行模擬,主要介紹如下:
1、Semaphore
JDK 1.5之後會提供這個類
Semaphore是一種基於計數的訊號量。它可以設定一個閾值,基於此,多個執行緒競爭獲取許可訊號,做完自己的申請後歸還,超過閾值後,執行緒申請許可訊號將會被阻塞。Semaphore可以用來構建一些物件池,資源池之類的,比如資料庫連線池,我們也可以建立計數為1的Semaphore,將其作為一種類似互斥鎖的機制,這也叫二元訊號量,表示兩種互斥狀態。
2、CountDownLatch
JDK 1.5之後會提供這個類,
CountDownLatch這個類能夠使一個執行緒等待其他執行緒完成各自的工作後再執行。例如,應用程式的主執行緒希望在負責啟動框架服務的執行緒已經啟動所有的框架服務之後再執行。
CountDownLatch是透過一個計數器來實現的,計數器的初始值為執行緒的數量。每當一個執行緒完成了自己的任務後,計數器的值就會減1。當計數器值到達0時,它表示所有的執行緒已經完成了任務,然後在閉鎖上等待的執行緒就可以恢復執行任務。
如下圖:
以上兩個類可以搭配使用,達到模擬高併發的效果,以下使用程式碼的形式進行舉例:
如上方法模擬5000次請求,同時最大200個併發操作,觀察最後的結果,發現每次的結果都有差別,和預期不符,得出結果部分如下:
最後結論:add 方法 非執行緒安全
那如何保證add方法 執行緒安全,將add方法進行如下修改即可:
執行結果如下:
最後結論:修改後 的 add 方法 執行緒安全
Java透過程式碼模擬高併發可以以最快的方式發現我們系統中潛在的執行緒安全性問題,此處使用Semaphore(訊號量)和 CountDownLatch(閉鎖)搭配ExecutorService(執行緒池)來進行模擬,主要介紹如下:
1、Semaphore
JDK 1.5之後會提供這個類
Semaphore是一種基於計數的訊號量。它可以設定一個閾值,基於此,多個執行緒競爭獲取許可訊號,做完自己的申請後歸還,超過閾值後,執行緒申請許可訊號將會被阻塞。Semaphore可以用來構建一些物件池,資源池之類的,比如資料庫連線池,我們也可以建立計數為1的Semaphore,將其作為一種類似互斥鎖的機制,這也叫二元訊號量,表示兩種互斥狀態。
2、CountDownLatch
JDK 1.5之後會提供這個類,
CountDownLatch這個類能夠使一個執行緒等待其他執行緒完成各自的工作後再執行。例如,應用程式的主執行緒希望在負責啟動框架服務的執行緒已經啟動所有的框架服務之後再執行。
CountDownLatch是透過一個計數器來實現的,計數器的初始值為執行緒的數量。每當一個執行緒完成了自己的任務後,計數器的值就會減1。當計數器值到達0時,它表示所有的執行緒已經完成了任務,然後在閉鎖上等待的執行緒就可以恢復執行任務。
如下圖:
以上兩個類可以搭配使用,達到模擬高併發的效果,以下使用程式碼的形式進行舉例:
如上方法模擬5000次請求,同時最大200個併發操作,觀察最後的結果,發現每次的結果都有差別,和預期不符,得出結果部分如下:
最後結論:add 方法 非執行緒安全
那如何保證add方法 執行緒安全,將add方法進行如下修改即可:
執行結果如下:
最後結論:修改後 的 add 方法 執行緒安全