多線程程序 java
對於多線程的好處這就很少說了。可是,它一樣也帶來了某些新的麻煩。只要在設計程序時特別當心留意,克服這些麻煩並不算太困難。 程序員
(1)同步線程多線程
許多線程在執行中必須考慮與其餘線程之間共享數據或協調執行狀態。這就 須要同步機制。在Java中每一個對象都有一把鎖與之對應。但Java不提供單獨的lock和unlock操做。它由高層的結構隱式實現, 來保證操做的對應。(然而,咱們注意到Java虛擬機提供單獨的monito renter和monitorexit指令來實現lock和unlock操做。) 併發
synchronized語句計算一個對象引用,試圖對該對象完成鎖操做, 而且在完成鎖操做前中止處理。當鎖操做完成synchronized語句體獲得執行。當語句體執行完畢(不管正常或異常),解鎖操做自動完成。做爲面向對象的語言,synchronized常常與方法連用。一種比較好的辦法是,若是某個變量由一個線程賦值並由別的線程引用或賦值,那麼全部對該變量的訪問都必須在某個synchromized語句或synchronized方法內。線程
如今假設一種狀況:線程1與線程2都要訪問某個數據區,而且要求線程1的訪問先於線程2, 則這時僅用synchronized是不能解決問題的。這在Unix或Windows NT中可用Simaphore來實現。而Java並不提供。在Java中提供的是wait()和notify()機制。使用以下: 設計
synchronized method-1(…){ call by thread 1. ∥access data area; available=true; notify() } synchronized method-2(…){∥call by thread 2. while(!available) try{ wait();∥wait for notify(). }catch (Interrupted Exception e){ } ∥access data area }
其中available是類成員變量,置初值爲false。若是在method-2中檢查available爲假,則調用wait()。wait()的做用是使線
程2進入非運行態,而且解鎖。在這種狀況下,method-1能夠被線程1調用。當執行 notify()後。線程2由非運行態轉變爲可運行態。當method-1調用返回後。線程2 可從新對該對象加鎖,加鎖成功後執行wait()返回後的指令。這種機制也能適用於 其餘更復雜的狀況。 code
(2)死鎖 對象
若是程序中有幾個競爭資源的併發線程,那麼保證均衡是很重要的。系統均衡是指每一個線程在執行過程當中都能充分訪問有限的資源。系統中沒有餓死和死鎖的線程。Java並不提供對死鎖的檢測機制。對大多數的Java程序員來講防止死鎖是一種較好的選擇。最簡單的防止死鎖的方法是對競爭的資源引入序號,若是一個線程須要幾個資源,那麼它必須先獲得小序號的資源,再申請大序號的資源。 資源
小結 同步
線程是Java中的重要內容,多線程是Java的一個特色。雖然Java的同步互斥不如某些系統那麼豐富,但適當地使用它們也能收到滿意的效果。