高並發線程安全問題


高並發線程:
1、當多個線程訪問同一個共享對象時,就是高並發線程。如,天貓雙十一等。因為線程的調度是搶占式的,當一個線程在訪問共享數據(可以是多行代碼也可以是成員變量)時,其他線程也參與了該共享數據的運算,就會造成數據污染,即線程安全

2、常見的高並發線程安全問題;
前提:
確定是否存在線程安全問題,即多個線程訪問同一個共享數據;
多線程運行內存分配:
共享數據存在於方法區中的靜態區中,每條子線程在執行線程任務時,都會在棧區中開辟自己的內存空間。子線程在運算共享數據時,會將該數據copy一份到自己的內存空間中進行運算然后將運算后的數據發送至靜態區中;

a、可見性
當多條線程在運算同一共享數據時,某條線程更改了共享數據,但是其他線程不知道,沒有使用更改后的數據,這時就會出現線程安全問題;

b、有序性
當線程中共享數據的編譯順序出現差錯時,即不是按照從上至下的順序的執行。就會出現線程問題。

c、原子性
避免編譯的互斥性,即線程在運算共享數據的過程中,要么執行完畢、要么不執行,不會出現編譯半途中端而去執行其他線程中的該共享數據。

解決方式:
a、volatile關鍵字:
用volatile關鍵字修飾共享變量可以解決有序性和可見性問題
static volatile int num = 0;
b、AtomicInteger原子類;
用原子類修飾變量,如, static AtomicInteger a = new AtomicInteger(0)
原子類共享變量,0表示a的初始值為0;該類可以解決可見性、有序性以及原子性問題;

原子類解決安全問題 :CAS機制 (如果某條線程搶到CPU,那么就會執行完代碼)
1、當子線程在運算靜態區中的共享數據時,會先將兩個數據相比較;
如果相等,則進行子線程中的運算,然后將運算后的結果返回給靜態區
如果不相等,則先將靜態區中的共享數據的值給子線程,再比較兩個值是否相等。。。重復執行
2、這樣可以保證一條代碼在執行過程中,要么執行完畢、要么不執行,不會執行到一半而中斷;

當然,以上線程安全問題也可以使用同步代碼塊、同步方法或者Lock鎖解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM