小白的多執行緒修行之路1(共享變數與不共享變數)

2021-10-04 08:21:41 字數 2458 閱讀 3134

本人,小白一枚,以下是我自己學習過程中所做的一些研究,如果有錯誤之處,還請指出來,我會及時改正,謝謝哈!!!

自定義執行緒類中的變數與其他執行緒可以有共享與不共享之分:

(1)不共享資料的情況

如下例所示:

通過執行緒池去建立三個執行緒,也可採用其他的形式,這裡所使用的是執行緒池去建立執行緒,每個執行緒都有自己的count變數,即try塊中的count變數,每個執行緒自己減少自己的count變數,這樣情況下就是變數不共享。

public class threadtest 

}});}}

}

執行結果如下:

pool-1-thread-2進入run方法

pool-1-thread-3進入run方法

pool-1-thread-1進入run方法

pool-1-thread-1執行結果為:4

pool-1-thread-1執行結果為:3

pool-1-thread-1執行結果為:2

pool-1-thread-1執行結果為:1

pool-1-thread-1執行結果為:0

pool-1-thread-3執行結果為:4

pool-1-thread-2執行結果為:4

pool-1-thread-3執行結果為:3

pool-1-thread-2執行結果為:3

pool-1-thread-2執行結果為:2

pool-1-thread-2執行結果為:1

pool-1-thread-3執行結果為:2

pool-1-thread-3執行結果為:1

pool-1-thread-2執行結果為:0

pool-1-thread-3執行結果為:0

通過上面的結果可以看到各個執行緒不是按照順序去執行。如果希望各個執行緒按照順序去執行需要採用鎖去實現執行緒的順序執行

public class threadtest 

}catch (exception e)finally

}});}}

}

加鎖成功

pool-1-thread-1進入run方法

pool-1-thread-1執行結果為:4

pool-1-thread-1執行結果為:3

pool-1-thread-1執行結果為:2

pool-1-thread-1執行結果為:1

pool-1-thread-1執行結果為:0

釋放鎖成功

加鎖成功

pool-1-thread-2進入run方法

pool-1-thread-2執行結果為:4

pool-1-thread-2執行結果為:3

pool-1-thread-2執行結果為:2

pool-1-thread-2執行結果為:1

pool-1-thread-2執行結果為:0

釋放鎖成功

加鎖成功

pool-1-thread-3進入run方法

pool-1-thread-3執行結果為:4

pool-1-thread-3執行結果為:3

pool-1-thread-3執行結果為:2

pool-1-thread-3執行結果為:1

pool-1-thread-3執行結果為:0

釋放鎖成功

(2)共享變數的情況(例如在實現銷售場景時,如果有多個執行緒同時訪問,必須乙個銷售員賣完乙個貨品之後,其他的銷售員才可以繼續在剩餘物品上減一操作,也就是按順序去減一操作)

public class threadtest 

}catch (exception e)finally

}});}}

}

執行結果如下(

由於count--,並非為原子操作,所以使用volatile使count對於其他執行緒可見,使用lock鎖是為了使執行緒順序執行,確保結果不會出現錯誤,

在jvm虛擬機器中操作分為以下三步:

(1)取得原有count的值

(2)計算count-1

(3)賦值給count

加鎖成功

pool-1-thread-1進入run方法

pool-1-thread-1執行結果為:4

釋放鎖成功

加鎖成功

pool-1-thread-2進入run方法

pool-1-thread-2執行結果為:3

釋放鎖成功

加鎖成功

pool-1-thread-3進入run方法

pool-1-thread-3執行結果為:2

釋放鎖成功

加鎖成功

pool-1-thread-4進入run方法

pool-1-thread-4執行結果為:1

釋放鎖成功

加鎖成功

pool-1-thread-5進入run方法

pool-1-thread-5執行結果為:0

釋放鎖成功

多執行緒共享變數 多執行緒共享全域性變數

1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...

多執行緒共享變數

題目如下 設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。如果每個執行緒執行的 相同 可以使用同乙個runnable物件,這樣在不同的執行緒中只需要把這個runnable物件傳到裡面去即可,因為runnable物件的run方法天熱原子性,不可能run方法被打斷,乙個run...

多執行緒共享變數

from threading import thread,lock global num 0 def func1 global global num 全域性變數 for i in range 1000000 lock.acquire 兩個執行緒會最開始搶這個鎖,拿到鎖就會處於關鎖,執行後面的程式,其...