多執行緒 例項變數與執行緒安全

2021-08-04 22:33:36 字數 1749 閱讀 4019

自定義執行緒類中的例項變數針對其他執行緒有共享和不共享之分,這在多個執行緒之間進行互動時是乙個很重要的技術點。
不共享資料的情況

下面通過乙個示例來看下資料不共享的情況。

package com.vhqimk.thread;

/* * 測試資料不共享的情況

*/public

class

test

}class

mythread

extends

thread

public

void run() }}

不共享資料執行結果如圖所示。

圖 1-1 不共享資料的執行結果

由圖 1-1可以看到,一共建立了三個執行緒,每個執行緒都有各自的count變數,自己減少自己的count變數的值。這樣的情況就是變數不共享,此示例不存在多個執行緒訪問同乙個例項變數的情況。

2. 共享資料的情況

共享資料的情況就是多個執行緒可以訪問同乙個變數,比如在實現投票功能的軟體時,多個執行緒可以同時處理乙個人的票數。

下面通過乙個示例來看下資料共享的情況。

package com.vhqimk.thread;

/* * 測試資料共享的情況

*/public

class

test

}class

mythread

extends

thread

}

執行結果如圖 1-2所示。

圖 1-2 共享資料執行結果

從圖 1-2中可以看到執行緒a和執行緒b列印出的count值都是3,說明a和b同時對count進行處理,產生了「非執行緒安全」問題,而我們想要的結果卻不是重複的,而是依次遞減的。

非執行緒安全主要是指多個執行緒對同乙個物件中的同乙個例項變數進行操作時會出現值被更改、值不同步的情況。若要解決,只需在需要執行緒同步執行的方法前加synchronized。下面是在方法前加上synchronized關鍵字解決非執行緒安全的問題示例。

package com.vhqimk.thread;

/* * 測試資料共享的情況

*/public

class

test

}class

mythread

extends

thread

}

執行緒同步執行結果如圖 1-3所示。

圖 1-3 方法呼叫被同步

總結:執行緒有共享資料和不共享資料之分,共享資料時容易出現「非執行緒安全」問題,可以用關鍵字synchronized 解決。synchronized 可以在任意物件和方法上加鎖,而加鎖的這段**稱為「互斥區」或「臨界區」。當乙個執行緒想要執行同步方法裡的**時,縣城首先嘗試去拿這把鎖,如果能夠拿到這把鎖,那麼這個執行緒就可以執行synchronized 裡面的**。如果不能拿到這把鎖,那麼這個執行緒就會不斷嘗試拿這把鎖,直到能夠拿到為止,而且是有多個執行緒同時去爭搶這把鎖。

例項變數與執行緒安全

public class mythread extends thread main方法跑一下 列印結果顯示,執行緒1,3,2列印的count的值都是3,產生了非執行緒安全問題。當thread 1執行count 時,分幾步完成 1 把count的值從主存中複製乙份到快取記憶體中 2 對count進行 ...

多執行緒與執行緒安全2

1 例子 用兩個執行緒,交替列印1 100的數字 public class main class number implements runnableelse try catch interruptedexception e 涉及到的三個方法 wait 一旦執行到此處,當前執行緒就進入阻塞狀態,並且...

多執行緒 執行緒安全

原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...