線程互斥與同步


通常情況下,程序中的多個線程是互相協調和互相聯系的,多線程之間有互斥和同步。

1.線程互斥

多個線程之間有共享資源(shared resource)時會出現互斥現象。

設有若干線程共享某個變量,而且都對變量有修改。如果它們之間不考慮相互協調工作,就會產生混亂。比如,線程A和B共用變量x,都對x執行增1操作。由於A和B沒有協調,兩線程對x的讀取、修改和寫入操作相互交叉,可能兩個線程讀取相同個x值,一個線程將修改后的x新值寫入到x后,另一個線程也把自己對x修改后的新值寫入到x。這樣,x只記錄后一個線程的修改作用。

 

臨界段:多線程互斥使用共享資源的程序段,在操作系統中稱為臨界段。臨界段是一種加鎖的機制,與多線程共享資源有關。

臨界段的作用是在任何時刻一個共享資源只能供一個線程使用。當資源未被占用,線程可以進入處理這個資源的臨界段,從而得到該資源的使用權;當線程執行完畢,便退出臨界段。如果一個線程已進入某個共享資源,並且還沒有使用結束,其他線程必須等待。

在JAVA中使用關鍵字synchronized定義臨界段,能對共享對象進行上鎖操作。

 

2.線程同步

多線程之間除了有互斥情況外,還有線程同步。當線程A使用某個對象,而此對象又需要線程B修改后才能符合本線程的需要,此時線程A就要等待線程B完成修改工作。這種線程相互等待稱為線程的同步。

為實現同步,JAVA語言提供了wait()、notify()和notifyAll()三個方法供線程在臨界段中使用。

在臨界段中使用wait()方法,使執行該方法的線程等待,並允許其他線程使用這個臨界段。wait()常用兩種格式:

  wait()——讓線程一直處於等待隊列,知道被使用了notify()或notifyAll()方法喚醒。

  wait(long timeout)——讓線程等待到被喚醒,或經過指定時間后結束等待。

當線程使用完臨界段后,用notify()方法通知由於想使用這個臨界段而處於等待狀態的線程結束等待。notify()方法只是通知第一個處於等待的線程。

如果某個線程在使用完臨界段方法后,其他早先等待的線程都可以結束等待,一起重新競爭CPU,則可以使用notifyAll()方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM