高併發執行緒:
1、當多個執行緒訪問同乙個共享物件時,就是高併發執行緒。如,天貓雙十一等。因為執行緒的排程是搶占式的,當乙個執行緒在訪問共享資料(可以是多行**也可以是成員變數)時,其他執行緒也參與了該共享資料的運算,就會造成資料汙染,即執行緒安全
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鎖解決。
併發安全問題
守護程序是指乙個程序守護另乙個程序 例如a是b的守護程序b如果結束了a也會隨之結束 def task name print s is running name time.sleep 3 if name main obj process target task,args egon obj.daemon...
Java併發程式設計 執行緒安全問題
1.執行緒安全的概念 當多個執行緒訪問某乙個類 物件或方法 時,這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的.synchronized 可以在任意物件或方法上加鎖,而加鎖的這段 稱為 互斥區 或 臨界區 示例 package com.thread.safety 執行緒安全...
併發 二 執行緒安全問題
一 執行緒安全 如圖示執行緒的工作記憶體與主記憶體的區別。加了violate關鍵字以後,就能保證執行緒記憶體中的變數及時回寫。但是這種情況一般適用於低併發,並且記憶體操作不涉及底層機器指令操作的情況下。對於如下所示的 public class thread lite public static vo...