定義:任務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