相關文章:
【多線程】一、線程狀態切換
【多線程】二、線程優先級&守護線程
【多線程】三、線程訪問變量
【多線程】四、線程異常抓捕
【多線程】五、線程池
【多線程】六、鎖與同步
【多線程】七、阻塞隊列
【多線程】八、異步計算結果獲取
【多線程】九、Android異步任務
原子性保障
Java內存模型只保證基本數據類型的讀取和常量賦值是原子操作;
volatile修飾符
建立一個內存柵欄,指令重排序不可通過有volatile
變量的語句;
volatile
變量在寫入操作後立即刷新主緩存並標記其他緩存無效;
final修飾符
final
變量只有初始化指令完成以後纔對線程可見並且不可修改,以保證數據正確性;
原子包
java.util.concurrent.atomic
包通過高級機器指令保證可見性和原子性;
J.U.C原子包的CAS分析具體可參見: https://blog.csdn.net/Fantastic_/article/details/86658468
ThreadLocal<T>
每個線程中該變量是獨享的,不同線程互不干擾;
- Key是虛引用ThreadLocal,該對象銷燬後JVM會在
get()
、set()
、remove()
時清理Null Key
;
但仍可能造成內存泄露;
ThreadLocal<SimpleDateFormat> format = ThreadLocal
.withInitial(()->new SimpleDateFormat("yyyy-MM-dd"));
// 第一次使用會初始化並保存在ThreadLocalMap中
// 之後使用本線程不再初始化,直到線程被銷燬
format.get();