執行緒安全
對共享資料(shared)和可變狀態(mutable)的訪問,共享是針對同時訪問而言,可變是生命周期角度而言,
解決執行緒安全的常用方法
1、java.util.concurrnet串行機制
如使用 AtomicLong 代替使用Long;
CopyOnWriteArrayList 代替 List;
并發容器:
CouncurrentHashMap : 分段鎖(Lock Striping),并發訪問下實作更高吞吐量;
HashTable 、synchronizedMap
阻塞佇列:
BlockingQueue
工具類: 信號量(Semaphore)、柵欄(Barrier)、
閉鎖(Latch):確保某些執行緒等其他執行緒彎成后再執行
2、內置鎖
java體統內置鎖機制,如synchronized,其有可重入性,即某個執行緒試圖獲得自己的鎖時,則會成功,
常用加鎖做法是,將所有可變狀態封裝在物件內部,
3、volatile
變數不會被快取在暫存器或其他cup不可見的地方,其不是加鎖,所以不會阻塞,因此輕量級,
3、LocalThread
提供set、get介面,僅在執行緒內部訪問
原理:為每個使用該變數的執行緒都創建一個副本
4、final
語意:當建構式結束時,final型別的值保證其他執行緒訪問該物件時,值可見,
屬于安全發布的一種方式(即一個執行緒在創建該物件時,其他執行緒可參考到該物件最新值),通俗講,若成員變數時final型別,一旦物件對其他執行緒可見,則final成員也必須賦值了,
eg:如果存在并發問題,需要同步機制訪問或使用concurrentHashmap,而final修飾不可變物件,可并發訪問,而不用使用同步機制,
5、顯示鎖:Lock
6、創建執行緒
Callable(介面):帶回傳結果,從執行緒的生命周期角度考慮,提供任務執行狀態和取消功能,
Runnable/Thread:只能前進,不能后退的執行緒,
7:池化
提供執行緒的抽象,基于生產者–消費者模式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259415.html
標籤:其他
上一篇:mysql必知必會
