1. 程式人生 > >java執行緒間通訊方式

java執行緒間通訊方式

1.同步

就是通過Synchronized關鍵字來進行同步訪問控制,確保誰拿到了相應的鎖才能執行相應的操作

本質上就是共享記憶體式的通訊,這個共享記憶體在java的記憶體模型中就是主記憶體,相當於通過主記憶體的資料進行執行緒通訊。因Synchronized解鎖時會將工作記憶體中的資料重新整理到主記憶體中,Synchronized加鎖時會將工作記憶體中的值清空從主記憶體讀。多個執行緒訪問同一變數,誰拿到了鎖誰就去訪問。

2.while輪詢

假設我們向一個List中存入元素,如果存入的元素達到了3個,我們就退出存入元素的執行緒,轉而進入另一個等待它存入三個元素的執行緒。那麼這個等待的執行緒我們使用while輪詢list集合中是否達到了三個,如果到了三個我們就進行下一步,沒有就一直輪詢

問題:這個方法有一個問題,我們沒辦法保證可見性,也就是說假設當加入元素的執行緒到達了3個,但是此時元素數量3只是處於工作記憶體中,那麼在它將工作記憶體中的3重新整理到共享記憶體中的這段時間中可能又加入了新的元素,加入後等待執行緒取到值,可是這時候已經大於3了,所以程式會出現問題。

3.wait/notify機制

這是一個Object裡的方法,兩個方法的作用就是沉睡和喚醒,當我們的等待執行緒發現沒有達到想要的條件我們就沉睡它,此時另一個執行緒來加入元素,當元素數量達到了3 ,我們可以喚醒等待執行緒,告訴他你的條件達到了,你繼續執行吧

問題:如果說新增元素的執行緒一下添加了3個,進行了喚醒操作,但是等待執行緒還沒執行到wait,這時產生了次空喚醒。當等待執行緒執行到wait之後沉睡,因為它要依靠新增元素的執行緒喚醒,但是新增元素的執行緒已經進行了喚醒,因此會一直沉睡。

4.訊息管道:

就是通過一條管道傳輸執行緒之間通訊的訊息。