java併發 多個執行緒間共享資料

2021-08-15 02:30:24 字數 1857 閱讀 1786

先看乙個多執行緒間共享資料的問題:

設計四個執行緒,其中兩個執行緒每次對data增加1,另外兩個執行緒每次對data減少1。

從問題來看,很明顯涉及到了執行緒間通資料的共享,四個執行緒共享乙個data,共同操作乙個data。我們先把上面這個問題放在一邊,慢慢分析多個執行緒之間共享資料的一些情況,從最簡單開始,分類分析完了後,到時候也好解決上面這個問題了。

這是最簡單的一種情況,比如賣票,幾個執行緒共同操作記錄票數的那個變數,任務都是使它減一。針對這種情況,我們只需要寫乙個類實現runnable介面即可,在run()方法中對這個票進行減一,然後將這個runnalbe扔給多個執行緒去執行,自然它們就操作同乙個data了。看一下**:

public

class

multithreadsharedata

}}class sharedata implements runnable

}// }

}}

這很好理解,也很容易實現,四個執行緒賣了4張票。執行結果為:

thread-0: 100 

thread-3: 99 

thread-2: 98 

thread-1: 97

就如上面那個題目所描述的,兩個執行緒執行data增,兩個執行緒執行data減。針對這種情況,我們要實現兩個runnable了,因為很明顯有兩個不同的任務了,乙個任務執行data增,另乙個任務執行data減。為了便於維護,可以將兩個任務方法放到乙個類中,然後將data也放在這個類中,然後傳到不同的runnable中,即可完成資料的共享。如下:

public

class

multithreadsharedata

}).start();

}for(int i = 0; i < 2; i ++)

}).start();

}

}}

class sharedata /*implements runnable*/

public

synchronized

void

decrement()

}

看一下列印結果:

thread-0: before : 0 

thread-0: after : 1 

thread-1: before : 1 

thread-1: after : 2 

thread-2: before : 2 

thread-2: after : 1 

thread-3: before : 1 

thread-3: after : 0

這樣寫的好處是兩個任務方法可以直接在方法名上進行同步操作,這種模式的好處在前面的博文中已經有說過了,封裝的好。 

最後總結一下,多個執行緒之間共享資料主要關注兩點就行:一是什麼任務?幾個任務?二是幾個執行緒?記住 一點:幾個任務和幾個執行緒是沒有關係的!100個執行緒可以執行乙個任務,也可以執行2個任務,3個任務…… 

如果只有乙個任務,那說明多個執行緒執行乙個任務,我們只要實現乙個runnable介面,把公共data放進runnable,把任務放進去run()中即可(任務注意要同步),然後開啟n個執行緒去執行這個任務即可;如果有m個任務,那我們新建乙個專門執行任務的類,把公共的data放進類中,把任務作為類中的同步方法即可,然後開啟n個執行緒,每個執行緒中扔乙個runnable,按照要求執行任務類中的方法即可。 

到這裡,終於能體會到任務和執行緒的分離了,這種思想也算是物件導向的一種吧,之前學習的時候沒啥感覺,現在越總結感覺思路越清晰。

多個執行緒間如何共享資料?

如果每個縣城執行的 相同,可以使用同乙個runnable物件,這個runnable物件中有那個共享資料。將共享資料封裝成另乙個物件,然後將這個物件逐一傳遞給各個runnable物件,每個執行緒對共享資料的操作方法也分配到那個物件身上,這樣容易實現針對資料進行各個操作的互斥和通訊。將runnable物...

JAVA 併發程式設計 多個執行緒之間共享資料(六)

1。假設每乙個執行緒執行的 同樣。能夠使用同乙個 runnable 物件,這個 runnable 物件中有那個共享資料,比如,賣票系統就能夠這麼做。2,假設每乙個執行緒執行的 不同。這時候須要用不同的 runnable 物件,比如,設計4個執行緒。當中兩個執行緒每次對j新增1。另外兩個執行緒對j每次...

併發程式設計 3 執行緒間共享資料

一 共享記憶體帶來的問題 讀時沒問題,寫時會有競爭問題。二 解決方法 1 最簡單的辦法就是對資料結構採用某種保護機制,確保只有進行修改的執行緒才能看到不變數被破壞時的中間狀態。從其他訪問執行緒的角度來看,修改不是已經完成了,就是還沒開始。2 另乙個選擇是對資料結構和不變數的設計進行修改,修改完的結構...