同步,異步,阻塞,非阻塞的Java例子

定義:任務A,任務Bhtml

同步:任務A和任務B之間有關聯,例如任務B中途要給任務A一個數字,那麼任務A或許須要等待任務B生產這個數,任務A須要等待任務B的這個動做叫作同步。java

異步:事件A和事件B之間沒有關聯,是相互獨立的,那麼相互都不用管對方幹了什麼。算法

定義:線程A和線程B,分別在執行任務A和任務B併發

阻塞:線程A須要等待線程B,因而線程A在等待這個數的步驟上被掛起,不能分到cpu,不能執行,這樣被稱爲阻塞。異步

非阻塞:線程一樣須要線程B給一個數,可是線程A僅僅告知線程B要給這個數,並無立刻就要使用這個數,此時線程A沒有被掛起,仍然能分到cpu,仍然能執行,這樣被稱爲非阻塞。ui


所以這兩對概念並無衝突,而是能兩兩組合。只是因爲組合後的狀態使得你們誤解了這兩組概念。下面給出java代碼上的例子,你們就能比較好的分辨了。spa

同步阻塞:.net

int i = System.in.read();

當命令終端沒有輸入時,調用該方法的線程被阻塞,表現出要和終端做同步。線程


異步非阻塞:unix

Future<T> future = threadPool.submit(Callable<T> callable);
...
...
...
future.get();

callable內的任務結果沒有立刻須要的必要,因而調用的submit()方法立刻返回一個實現Future的存根。callable任務對於當前線程是異步的,不須要阻塞當前線程。

可是到最後當前線程須要callable任務的結果,此處就須要同步,get()方法經過阻塞來實現。


同步非阻塞:

concurrentLinkedQueue.offer((T) t);

該過程一個元素須要入隊列,該併發隊列爲了讓當前線程不阻塞(避免線程切換而耗費時間)而又能正確入隊,使用CAS算法實現的樂觀鎖循環嘗試入隊。offer()方法並無阻塞當前線程,而又但願同步,因而經過循環來實現,最終實現同步非阻塞。


異步阻塞:

沒有例子。設想一下,阻塞是用來實現同步的,這樣和同步阻塞有什麼區別,那麼實現這個還有什麼用?


最後,因爲倉促,可能上面有誤,若是有誤,請多指教,謝謝。


References & Thx:http://blog.chinaunix.net/uid-26000296-id-3754118.html

相關文章
相關標籤/搜索