最近復(fù)習(xí)java并發(fā)的知識蝙叛,在這之前间景,我們先了解一下java中的一些概念:
- 我們常說同步與異步兄春。通俗來說他們描述的是在異步環(huán)境下(多個線程時不相干的)主胧,并發(fā)線程之間的訪問共享資源時通過消息通知的協(xié)作方式晦譬。
- 同步: 在一個線程對共享資源進行訪問時疤苹,其他線程需要等待,可能會阻塞敛腌,在后面線程狀態(tài)中再詳細談卧土。
- 異步:在一個線程對共享資源進行訪問時,其他線程在等待的時間像樊,可以去做自己的事情尤莺。
- java中提供的同步機制:wait/notify、Synchronized關(guān)鍵字生棍、volatile颤霎、并發(fā)容器、涂滴、基于AQS的同步工具類(可重入鎖等)友酱、ThreadLocal、原子類等
- 再來說一下 并行與串行:
- 并行: 多個任務(wù)是同時執(zhí)行的
- 串行: 多個任務(wù)是順序執(zhí)行的
關(guān)注的是任務(wù)的執(zhí)行方式柔纵,在多線程中缔杉,串行的任務(wù)一個一個執(zhí)行,直到結(jié)束搁料。并行中多個任務(wù)在同一時間點執(zhí)行或详。
最后來說一下并發(fā)系羞,通俗來說,就是多個任務(wù)在同一個時間段內(nèi)去執(zhí)行霸琴,要與并行的同一時間點區(qū)別開來椒振,舉個例子,并行:運動會沈贝,十名運動員同時在自己的跑道上奔跑杠人;并發(fā):運動會上,十名運動員接力跑宋下。
來點理論的:
- 并發(fā)與并行其實都是多個任務(wù)一起執(zhí)行嗡善,但是并行更側(cè)重的是一個時間點,也就是說多個任務(wù)是同時執(zhí)行的学歧,是物理上的同時執(zhí)行罩引,要求多個CPU核心,當(dāng)只有一個cpu核心時枝笨,是無法實現(xiàn)并行 的袁铐,而并發(fā)是邏輯上的同時運行,側(cè)重的是一個時間段横浑,在一個核心上多個任務(wù)交替執(zhí)行剔桨,但是他們可以交替獲得時間片,造成并行的錯覺徙融。