1、并發(fā)編程中有兩個關(guān)鍵問題:線程通信和線程同步
a、線程通信:是指線程之間通過何種機制來進行信息的交換
b、線程同步:是指用于控制線程之間操作發(fā)生的相對順序的機制
線程通信可以通過共享內(nèi)存和消息傳遞,在共享內(nèi)存的并發(fā)模型里,線程之間通過對共享內(nèi)存的讀寫進行隱式通信,但是線程同步必須是顯式的。java并發(fā)采用的是共享內(nèi)存的模型。
2、java內(nèi)存模型(JMM)是一種抽象模型,它定義了線程和主內(nèi)存之間的關(guān)系,線程之間的共享變量存儲在主內(nèi)存中,每個線程都有一個私有的本地內(nèi)存,本地內(nèi)存存儲了該線程的共享變量的副本。
3、重排序:java程序從源代碼到匯編指令,為了提高性能,編譯器和處理器往往會對指令進行重排序。
a、編譯器重排序:編譯器在不改變單線程程序語義的前提下,會重新安排語句的執(zhí)行順序。
b、處理器重排序:處理器將多條指令重疊執(zhí)行,在不存在數(shù)據(jù)依賴的情況下,處理器可以改變語句對應(yīng)機器指令的執(zhí)行順序
c、內(nèi)存系統(tǒng)的重排序:由于處理器使用讀寫緩沖區(qū),這使得加載和存儲操作看上去可能是亂序執(zhí)行的
4、先行發(fā)生原則(happens-before):一個操作對另一個操作是可見的,不管怎么重排序,保證單線程的程序執(zhí)行結(jié)果不能被改變,還能保證正確同步的多線程程序執(zhí)行結(jié)果不被改變。
5、as-if-serial語義:不管怎么重排序(編譯器和處理器重排序),單線程的執(zhí)行結(jié)果不改變
6、數(shù)據(jù)依賴:兩個操作訪問同一個變量,并且有一個是寫操作,這兩個操作之間存在數(shù)據(jù)依賴。
7、控制依賴:有控制條件的關(guān)系
8、順序一致性模型:
a、一個線程中的所有操作必須按照程序的順序來執(zhí)行
b、所有線程都只能看到一個單一的操作執(zhí)行順序,每個操作都必須原子執(zhí)行且對所有線程立即可見
9、鎖不僅對臨界區(qū)有互斥的作用,還有內(nèi)存語義,釋放鎖的時候會把共享變量的值刷新到主內(nèi)存,獲取鎖的時候共享變量值的讀取直接從內(nèi)存里面拿
釋放鎖的內(nèi)存語義和volatile寫的內(nèi)存語義相同,獲取鎖的內(nèi)存語義和volatile讀的內(nèi)存語義相同
10、concurrent包的實現(xiàn):
底層使用CAS加volatile變量
上層使用AQS、非阻塞數(shù)據(jù)結(jié)構(gòu)和院子變量類來實現(xiàn)
對外提供Lock、同步器、阻塞隊列、Executor和并發(fā)容器