06.19 2018java面試多線程進階案例-實際線程鎖同步案例

面試題1、三個線程A/B/C併發運行,B/C需要A線程的數據怎麼實現?

分析:根據問題描述,我們將問題用一下代碼演示,threadA/threadB/threadC,threadA用於初始化數據num,只有當num初始化完成之後再讓threadB和threadC獲取到初始化後的變量num。考慮到線程的不確定性,因此我們不能確保threadA就一定先於threadB和trheadC前執行,就算threadA先執行了,我們也不能保證threadA什麼時候才能將變量num初始化完成。因此我們必須讓threadB和threadC去等待threadA完成之後發出消息。現在需要解決2個難題,一是讓threadB和threadC等待threadA先執行完成;二是threadA執行完成後給threadB和threadC發送消息。這裡給出了使用純java API的Semaphore類來控制線程的等待和釋放,案例代碼如下:

2018java面試多線程進階案例-實際線程鎖同步案例

面試題1:線程等待與喚醒案例

2018java面試多線程進階案例-實際線程鎖同步案例

面試題1運行效果圖

面試題2、同一個類中的2個方法都加了同步鎖,多個線程能否同時訪問同一個類中的這兩個方面嗎?

分析:這個問題考慮到Lock和synchronized兩種實現鎖的不同情形。兩種鎖的結果是截然不同的。Lock可以讓等待鎖的線程響應中斷,Lock獲取鎖,之後需要釋放鎖。演示兩個鎖的使用及運行結果代碼如下:

2018java面試多線程進階案例-實際線程鎖同步案例

面試題2:Lock鎖

2018java面試多線程進階案例-實際線程鎖同步案例

面試題2:Lock鎖運行結果

2018java面試多線程進階案例-實際線程鎖同步案例

面試題2:synchronized鎖

2018java面試多線程進階案例-實際線程鎖同步案例

面試題2:synchronized鎖運行結果

由上兩個源碼效果可知,Lock鎖不能同時,synchronized可以同時訪問。

2018java面試多線程進階案例-實際線程鎖同步案例


分享到:


相關文章: