Java并發(fā)基礎之核心篇
上一期介紹了基礎理論矗积,讓大家對并發(fā)有了基本的概念全肮,這期也是并發(fā)理論的核心內容。
核心概念
共享性
數據的共享是并發(fā)安全的關鍵原因棘捣。
線程之間如果數據是隔離的話辜腺,那么也就不存在并發(fā)安全的問題。我們常常不關心并發(fā)安全的問題,是因為很多時候數據是在單一線程內產生评疗、使用直到消亡测砂。即使是線程管理也由服務中間件(Tomcat、Jetty等)完成的百匆,所以平時工作中很少關注并發(fā)安全的問題邑彪。
互斥性
并發(fā)操作的互斥是并發(fā)安全的主要手段。
線程之間如果數據是共享的話胧华,那么想達到并發(fā)安全寄症,就需要通過互斥的并發(fā)操作來保證并發(fā)安全。當多個線程對相同的共享數據操作時矩动,保證操作的共享數據沒有被同時寫入有巧、修改等操作。
原子性
并發(fā)操作的原子性悲没,是保證并發(fā)安全的重要因素篮迎。
并發(fā)操作如果是都是原子性的,那么也可以保證并發(fā)安全示姿,比如說AtomicInteger等工具類甜橱,提供了一系列的具有原子特性的操作方法。
可見性
共享數據的可見性是一個相對不容理解的概念栈戳,需要對計算機組成原理有一些了解岂傲。
簡單介紹一下CPU與內存之間交互原理,每個CPU核心都有自己的緩存空間子檀,當CPU需要處理內存中的數據時镊掖,就要從內存把數據同步到緩存中,當然內存中的數據是共享的褂痰,所以CPU處理之后的緩存數據還沒有及時刷新到內存中亩进,那么這個修改后的數據對于其他核心(可以理解為線程)就是不可見的。
有序性
為了提升性能缩歪,JVM會對指令重排序归薛,這回導致并發(fā)編程的結果不符合預期,這樣就會導致并發(fā)問題匪蝙,所以指令的有序性也是并發(fā)安全的一個重要指標主籍。
- 編譯器重排序,會在不改變單一線程中程序預期結果的前提下骗污,進行執(zhí)行語句的重排序崇猫。
- 指令集重排序,在不存在數據依賴的情況下處理可以改變執(zhí)行語句對應機器指令的執(zhí)行順序
- 內存重排序需忿,由于CPU诅炉、高速緩存和主內存之間存在一個同步問題蜡歹,那么加載和存儲操作可能是亂序的。
所以如果保證操作的有序性也可以間接保證并發(fā)的安全性涕烧。
總結
這期給大家介紹了這些特性月而,相對并發(fā)來說是比較核心的,之后對于并發(fā)相關的內容介紹都會圍繞這些特性來說议纯,希望對大家會有幫助父款。
請大家多多關注,多多交流。