當多個執行緒訪問某乙個類(物件或方法時),這個類始終都能表現出正確的行為,那麼這個類(物件或方法)就是執行緒安全的。
public
class
mythread
extends
thread
}public
static
void
main
(string[
] args)
}
結果如下:
t1正在執行:4
t1正在執行:2
t1正在執行:1
t1正在執行:0
t2正在執行:3
上述**中,我們的期望結果是 列印count的值應為: 4 3 2 1 0,與預期結果不相符合,所以mythread這個類執行緒不安全,簡單來講,就是有多個執行緒去操作count這個變數,但是count變數的值並不是我們期望的值,這就引發了執行緒安全的問題。
public
class
mythread
extends
thread
}public
static
void
main
(string[
] args)
}
結果如下:
t2正在執行:4
t2正在執行:3
t2正在執行:2
t2正在執行:1
t2正在執行:0
可以在任意物件及方法上加鎖,而加鎖的**稱為「互斥區」或「臨界區」,加了synchronized關鍵字後, 當多個執行緒訪問mythead的run方法時,以排隊的方式進行處理(這裡的排隊是按照cpu分配的先後順序而定的),乙個執行緒想要執行synchronized**體內容,,必須得等上乙個執行緒執行完,才能拿到鎖,如果拿不到鎖,這個執行緒就會不斷的嘗試獲得這把鎖,直到拿到為止,而且多個執行緒同時去競爭這把鎖。如果想要達到執行緒安全,大概有以下辦法:
執行緒安全需要保證幾個基本特徵:
可見性:是乙個執行緒修改了某個共享變數,其狀態能夠立即被其他執行緒知曉,通常被解釋為將執行緒本地狀態反映到主記憶體上。
有序性:是保證執行緒序列語義,避免指令重排等。
能夠實現執行緒安全得方法很多,上面synchronized雖然能保證執行緒安全,但是會導致鎖競爭問題,比如,當有100個執行緒在同時操作乙個變數,當執行緒1執行完畢後,後面的執行緒2到執行緒100,一共99個執行緒,都會去爭奪這一把所,產生非常激烈的鎖競爭問題,這可能會導致伺服器的cpu使用率過高。
JAVA多執行緒之 執行緒池
執行緒池顧名思義,就是乙個放置執行緒的池子。就跟資料庫連線池差不多。執行緒池通過對併發執行緒的控制,能有效的節省系統資源的浪費,提高系統的效能。學習執行緒池,先了解一下執行緒池的乙個基本結構 executor是乙個介面,其中只有乙個方法,就是execute方法。所以executor實際就是乙個執行緒...
java多執行緒之執行緒的安全性 一
物件的狀態 物件的狀態是指儲存在狀態變數 例項或靜態域 中的資料。物件的狀態還可能包括其他依賴物件的域。例如,hashmap的狀態不僅儲存在物件本身,還儲存在map.entry物件中。多執行緒安全的概念 當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調...
多執行緒之執行緒安全問題
講到執行緒安全 enn。怎麼說呢 這是乙個很複雜的東西 算了直接上 吧 文章中 有些我也是複製的不過我不像別人看都不看 我都看過一邊覺得對的我才會複製 public class securitythead public static void main string args catch inter...