執行緒限制性
通俗的講,就是不想共享資料了,在自己的執行緒內部操作。
ad-hoc執行緒限制
ad-hoc執行緒限制是指維護執行緒限制性的任務全部落在實現上的這種情況。因為沒有可見性修飾符與本地變數等語言特性協助將物件限制在目標執行緒上,所以這種方式是非常容易出錯的。
棧限制執行緒限制一種特例,通過本地變數觸及物件。本地變數本身就被限制執行執行緒中:存在於這個執行執行緒棧。其他執行緒無法訪問。
threalocal
一種維護執行緒限制的更加規範的方式是使用 threadlocal,它允許你將每個執行緒與持有數值的物件關聯在一起。 threadlocal提供了get與set訪問器,為每個使用它的執行緒維護乙份單獨的拷貝。所以get總是返回由當前執行執行緒通過set設定的最新值。
應用場景
threalocal主要為了防止在基於可變的單體或全域性變數的設計中,出現共享的情況。
兩種場景:
1、資料庫連線獲取connection。
乙個單執行緒應用可能會維護乙個全域性的資料庫連線。此connection在啟動時就已經被初始化。這樣就避免了為每乙個方法都傳遞乙個connection。因為jdbc規範並未要求connection本身一定是執行緒安全的。通過利用threadlocal儲存jdbc連線,每個執行緒都會擁有屬於自己的connection。
2、乙個頻繁執行的操作急需要向buffer這樣的臨時物件,還需要避免每次都重新分配該臨時物件。
在springboot中應用
首先封裝threadlocal,設定get和set方法以及移除方法,在一次請求中,在filter中攔截請求,在dofiler中儲存當前執行緒的id,在controller裡面可以呼叫threadlocal中的方法,比如使用get方法獲取執行緒id,之後在呼叫完之後,在***裡面呼叫threadlocal中移除方法,將值移除。這裡在主方法裡面要註冊過濾器並建立例項,在繼承的類裡新增***例項。
stringbuffer:執行緒安全 -- 原始碼裡面方法含有synchronized關鍵字,但是由於含有了這個關鍵字,效能會有所下降。
stringbuilder:相愛難測不安全 -- 原始碼裡面方法不含有synchronized關鍵字。為什麼依舊使用?因為在乙個方法中採用定義區域性變數的方法來使用時,由於存在堆疊限制,也是執行緒安全的,而且效能比stringbuffer更好。
******dateforma:非執行緒安全共享物件,一旦有多個物件呼叫,會傳送異常。
解決辦法:可以使用堆疊限制方法,在方法中建立物件(每次呼叫都會新建一次,區域性變數概念),就可以正常執行。
arraylist:執行緒不安全
hashset:執行緒不安全
hashmap:執行緒不安全
先檢查再執行:if(condition(a)) :執行緒不安全,如果兩個執行緒都訪問到了if,且都通過了,就會發生執行緒不安全。不具有原子性。
同步容器
arraylist-->vector、stack(兩者方法前有同步關鍵字)
vector:在多執行緒操作順序不一樣的時候(比如乙個刪除元素,乙個獲取元素,加入當執行緒執行到第9個元素時要獲取時,此時另乙個執行緒將第九個元素移除了),也會造成異常,執行緒不安全。
另外,遍歷時不做更新,單執行緒、多執行緒(概率更大)都會發生異常。解決辦法:在iterator時,新增synchronized關鍵字做同步,還可以使用併發容器。
hashmap-->hashtable(key、value不能為空)
collections.synchronized***(list、set、map):工具同步類
安全共享物件策略
執行緒限制:乙個被執行緒限制的物件,由執行緒獨佔,並且只能被占有他的執行緒修改。
共享唯讀:乙個共享唯讀的物件,在沒有額外同步的情況下,可以被多個執行緒併發訪問,但是任何執行緒都不能修改他
執行緒安全物件:乙個執行緒安全的物件或者容器,在內部通過同步機制來保證執行緒安全,所以其他執行緒無需額外的同步就可以通過公共介面隨意訪問它
被守護物件:被守護物件只能通過獲取特定的鎖來訪問。
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒不安全 就是不提供資料訪問保護,在多執行緒環境中對資料進行修改,會出現資料不一致的情況。執行緒安全 就是多執行緒環境中有對全域性變數的變動時,需要對執行的 塊採用鎖機制,當乙個執行緒訪問到某個資料時,其他執行緒需要等待當前執行緒執行完該 塊才可執行,不會出現資料不一致或者資料被汙染。如果一段 ...