多執行緒如何實現不加鎖實現高併發

2021-10-04 22:47:16 字數 907 閱讀 8741

最主要的想法是運用多執行緒實現高併發的處理資料,用來提公升對資料的處理速度,起初運用的是執行緒池和普通資料庫連線但是併發操作會造成死鎖的問題出現,原因是兩個執行緒同時搶到了同乙個資源造成的,解決方式是給要執行的物件上乙個鎖,但是這樣就相當於哪個執行緒先搶到了就會將業務鎖上其他都在等待,實際上就還是相當於單執行緒在執行業務。後來運用到了資料庫連線池這樣就解決了多個執行緒同時搶到資源後可以同時處理。以下是兩種方式測試的結果。測試的方式是逐條刪除表中第一條資料看執行緒處理時間。

下表是運用執行緒池和使用普通資料連線,進行的單執行緒和多執行緒測試結果。

測試時間 執行緒數 刪除條數 執行處理總時長

執行緒數執行處理總時長

1169454 ms

10166140 ms

1169454 ms

3139143 ms

以上可以看出,多執行緒與單執行緒在處理刪除1000資料的時候有時單執行緒快,有時多執行緒快,在刪除100條資料的時候也是沒差多少,分析應該是多執行緒實際上執行逐條刪除業務的時候,還是單執行緒在跑。因為它是普通資料庫連線,對資料庫操作只能是逐條操作的。所以必須對刪除方法加上乙個lock鎖,如果不加就會報死鎖。所以這樣的多執行緒是無意義的。

接下來我們運用了執行緒池及資料庫連線池,進行單執行緒和多執行緒的執行速度測試。

執行緒數執行處理總時長

134522 ms

316767 ms

135630 ms

318295 ms

以上可以看出多執行緒處理資料的優勢明顯的顯示出來了,有幾次慢的原因是資料庫不是本地,資料庫存在網路異常波動,導致資料庫連線本身就很慢。但是大量的實驗證明多執行緒處理速度比單執行緒快。這裡有一點要說明,多執行緒存在同時搶到統一資源的情況是不可避免的,這樣比如說兩個執行緒都搶到同一id,並對這個id下的值進行刪除,肯定會存在乙個執行緒空刪除資料的操作,這樣資料量就不對了。但是又不想加鎖那就得對要處理的業務進行判斷.

多執行緒訪問共享記憶體的不加鎖實現方式

多執行緒訪問共享記憶體,為了實現同步,常採用加鎖的方式。那麼,如何採用不加鎖的方式來達到執行緒同步的目的呢?思路 儲存兩塊共享記憶體,一塊用於讀操作,一塊用於寫操作。初始時,兩塊共享記憶體內容一致。讀操作均是讀取第一塊共享記憶體的資料 寫操作均是寫第二塊共享記憶體。在多個讀操作乙個寫操作的情況下,讀...

Python 多執行緒不加鎖分塊讀取檔案

多執行緒讀取或寫入,一般會涉及到同步的問題,否則產生的結果是無法預期的。那麼在讀取乙個檔案的時候,我們可以通過加鎖,但讀不像寫操作,會導致檔案錯誤,另外鎖操作是有一定的耗時。因此通過檔案分塊,可以比較有效的解決多執行緒讀問題,之前看到有人寫的分塊操作,比較複雜,需要實現建立好執行緒以及所讀取塊資訊,...

多執行緒高併發

修飾靜態方法鎖的是class,非靜態鎖方法鎖的是this,只有拿到這個物件才可以繼續執行 synchronized是可重入鎖 執行緒1的方法1呼叫執行緒2的方法2,判斷是同一把鎖,在同乙個執行緒,可以呼叫。synchronized的鎖公升級 hotsport 鎖公升級過程 保證執行緒可見性 mesi...