1. 程式人生 > >Java執行緒的同步和通訊

Java執行緒的同步和通訊

           當兩個或兩個以上的執行緒需要共享資源,它們需要某種方法來確定資源在某一刻僅被一個執行緒佔用。達到此目的的過程叫做同步(synchronization)。像你所看到的,Java為此提供了獨特的,語言水平上的支援。同步的關鍵是管程(也叫訊號量semaphore)的概念。管程是一個互斥獨佔鎖定的物件,或稱互斥體(mutex)。在給定的時間,僅有一個執行緒可以獲得管程。當一個執行緒需要鎖定,它必須進入管程。所有其他的試圖進入已經鎖定的管程的執行緒必須掛起直到第一個執行緒退出管程。這些其他的執行緒被稱為等待管程。一個擁有管程的執行緒如果願意的話可以再次進入相同的管程。在java程式中實現同步必須對共享的資源使用synchronized關鍵字,如:

class Demo{

      synchronized void test(){

//方法體}

}

或者是在呼叫該資源的時候使用關鍵字:

class Test implements Runnable {

Demo demo;

public void run(){

synchronized(demo){

demo.test();}

}

}

     當然實現同步的關鍵必須讓共享的資源同時讓需要同步的單位同時享有機會。

        說道執行緒,不由得就會想到程序,畢竟在尚未接觸這門語言的時候我們啟動工作管理員的時候,特別是在程式卡死重啟的過程中,系統提示程式還是執行,就需要開啟第二欄的程序管理,從而結束程序,扯遠了,在學到執行緒的時候,或許對理解程序乃至程式、計算機傳輸資料可能都會有一些模糊的概念了,對比二者確實有很多相似之處,二者的關係如同主水管接了很多分支,然後分支又分支,再分支的或許就是執行緒了,而程序就是分支,通過這個對比便能很好的理解執行緒和程序了,首先是執行緒肯定是要被程序所包含的,Java也能夠被看成是一個程序,而執行緒是可以共享資源的程序是不能夠的,程序是一個獨立的執行環境,執行緒可以看做是輕量級的程序。

        說到通訊問題,這事情瞬間就高大上了,到底是發微信,還是微博私信呢?看來都不是,就是在它耳邊輕輕的說就行了,老師舉得例子是生產和消費的通訊問題,生產和消費的中間放著的便是產品了,所以通訊的前提還是得同步,也就是當下比較流行的資訊對稱的意味,然後就得通過一些方式來判斷了,比如生產者先生產一個商品,然後在通知消費者前來消費,這裡就很考究了, 呼叫的是notify()方法,前來通訊的,當然也可以判斷,當生產者沒有商品的時候,救通知消費者等一等使用wait()方法,在這裡補充一下(wait(),notify(),notifyAll()不屬於Thread類,而是屬於Object基本類,也就是說每個對像都有wait(),notify(),notifyAll()的功能.)

對於消費者是一樣的,就這樣完成了通訊的過程,具體例子在上一篇。