關於線程同步相關問題解決思路

線程同步是指有一個線程在對內存進行操作時,其他線程都不可以對這個內存地址進行操作,直到該線程完成操作, 其他線程才能對該內存地址進行操作,而其他線程又處於等待狀態,目前實現線程同步的方法有很多,臨界區對象就是其中一種。

比如說,A在車站1買票,B在車站2買票,假設車票的總數是100,A買完一張後,B再去買票則只剩下99張。我們以這個例子,以實現接口的方式創建多線程,來說明解決該問題的思路

關於線程同步相關問題解決思路

由上顯示結果可知,創建兩個線程,同時調用run方法,說明定義了兩個成員變量i ,則票的總數應該是200,說明該思路是錯的。我們應該規定i=100,且兩個線程同時共享此變量i 修改如下:

關於線程同步相關問題解決思路

出現這個問題的原因,則是當線程1剛走完打印輸出這一行代碼,而沒有執行i--的時候,cpu則去執行線程0,則會出現以上的情況。所以,只要是執行if()後,應該是執行if的全部代碼,而不允許中途執行其他線程。修改如下:

關於線程同步相關問題解決思路

修改的部分也就增加兩行代碼而已,意思很明顯,就是隻要執行到if,則必須執行完這整個部分,才執行其他程序。synchronized這個函數修飾代碼塊是則需要加(),裡面放任意的字符串,如果修飾函數,則什麼都不需要加。

關於線程同步相關問題解決思路

另外可以思考這樣一個問題,當我們只改變如下代碼,其他的什麼都不變,效果會怎樣呢?

關於線程同步相關問題解決思路

顯然是錯的,這是為什麼呢?

我們在使用繼承thread的做示例:也就是在上例中,將實現修改為繼承,然後將字符串變量a定義成靜態的。其他的沒有任何改變,我們還是可以得出正確的結果

關於線程同步相關問題解決思路

其實也就是創建兩個對象,兩個進程是相互獨立的(鑰匙a是獨立的),所以不加static就會出錯。如果實在不能理解,那可以在編寫的時候鑰匙a和票數全部加上static,結果也是正確的。先會寫,再理解,熟能生巧。


分享到:


相關文章: