1谣拣、同步
通過synchronized關(guān)鍵字這種方式來實(shí)現(xiàn)線程間的通信杠袱。
(學(xué)Linux的時(shí)候?qū)W過共享內(nèi)存通信辐怕,在C中通過全局變量也行铲觉,雖然java木有)
這種方式澈蝙,本質(zhì)上就是“共享內(nèi)存”式的通信。多個(gè)線程需要訪問同一個(gè)共享變量撵幽,誰拿到了鎖(獲得了訪問權(quán)限)碉克,誰就可以執(zhí)行。
2并齐、while輪詢的方式
線程A不斷地改變條件漏麦,線程ThreadB不停地通過while語句檢測(cè)這個(gè)條件是否成立 客税,從而實(shí)現(xiàn)了線程間的通信。但是這種方式會(huì)浪費(fèi)CPU資源撕贞。之所以說它浪費(fèi)資源更耻,是因?yàn)镴VM調(diào)度器將CPU交給線程B執(zhí)行時(shí),它沒做啥“有用”的工作捏膨,只是在不斷地測(cè)試 某個(gè)條件是否成立秧均。就類似于現(xiàn)實(shí)生活中,某個(gè)人一直看著手機(jī)屏幕是否有電話來了号涯,而不是: 在干別的事情目胡,當(dāng)有電話來時(shí),響鈴?fù)ㄖ猅A電話來了链快。關(guān)于線程的輪詢的影響
3誉己、wait/notify機(jī)制
這里用到了Object類的 wait() 和 notify() 方法。(自行百度理解這兩個(gè)函數(shù))
當(dāng)條件未滿足時(shí)域蜗,線程A調(diào)用wait() 放棄CPU巨双,并進(jìn)入阻塞狀態(tài)。---不像while輪詢那樣占用CPU
當(dāng)條件滿足時(shí)霉祸,線程B調(diào)用 notify()通知 線程A筑累,所謂通知線程A,就是喚醒線程A丝蹭,并讓它進(jìn)入可運(yùn)行狀態(tài)慢宗。
4、管道通信就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream進(jìn)行通信
總結(jié)###
分布式系統(tǒng)中說的兩種通信機(jī)制:共享內(nèi)存機(jī)制和消息通信機(jī)制奔穿。感覺前面的①中的synchronized關(guān)鍵字和②中的while輪詢 “屬于” 共享內(nèi)存機(jī)制镜沽,由于是輪詢的條件使用了volatile關(guān)鍵字修飾時(shí),這就表示它們通過判斷這個(gè)“共享的條件變量“是否改變了巫橄,來實(shí)現(xiàn)進(jìn)程間的交流淘邻。