線程安全

線程安全

為什么有線程安全問題姑丑?

當多個線程同時共享让网,同一個全局變量或靜態(tài)變量呀忧,做寫的操作時,可能會發(fā)生數(shù)據(jù)沖突問題溃睹,也就是線程安全問題而账。但是做讀操作是不會發(fā)生數(shù)據(jù)沖突問題。

線程安全解決辦法:

問:如何解決多線程之間線程安全問題?

答:使用多線程之間同步synchronized或使用鎖(lock)因篇。

synchronized:效率很低

同步代碼塊:

什么是同步代碼塊泞辐?答:就是將可能會發(fā)生線程安全問題的代碼笔横,給包括起來。synchronized(同一個數(shù)據(jù)){

?可能會發(fā)生線程沖突問題的代碼

}

就是同步代碼塊?

synchronized(對象)//這個對象可以為任意對象?{

?????需要被同步的代碼?

}?

對象如同鎖咐吼,持有鎖的線程可以在同步中執(zhí)行?沒持有鎖的線程即使獲取CPU的執(zhí)行權吹缔,也進不去?

同步的前提:?

1,必須要有兩個或者兩個以上的線程?

2锯茄,必須是多個線程使用同一個鎖?必須保證同步中只能有一個線程在運行? ?

好處:解決了多線程的安全問題?

弊端:多個線程需要判斷鎖厢塘,較為消耗資源、搶鎖的資源肌幽。

同步函數(shù):

什么是同步函數(shù)晚碾?? ??

答:在方法上修飾synchronized 稱為同步函數(shù)

同步函數(shù)使用this鎖。一個線程用同步函數(shù)喂急,另一個用同步代碼塊格嘁,線程不同步。

靜態(tài)同步函數(shù)不用this鎖廊移,

問:為什么使用線程同步或使用鎖能解決線程安全問題呢糕簿?

答:將可能會發(fā)生數(shù)據(jù)沖突問題(線程不安全問題),只能讓當前一個線程進行執(zhí)行画机。代碼執(zhí)行完成后釋放鎖泞歉,讓后才能讓其他線程進行執(zhí)行芋簿。這樣的話就可以解決線程不安全問題嫌变。

問:什么是多線程之間同步俩滥?

答:當多個線程共享同一個資源,不會受到其他線程的干擾。

線程死鎖

死鎖主要是同步代碼塊或同步函數(shù)中嵌套同步引起的荚醒。

線程安全的三大特性

原子性芋类、可見性、有序性界阁。

簡單的說原子性就是多線程操作中要保障數(shù)據(jù)一致性侯繁,可見性就是多個線程訪問同一個變量時,某個線程對該變量的操作時泡躯,能夠讓其他線程可見(線程通信)贮竟,有序性就是多線程運行中對代碼的重排序不能影響代碼的邏輯。

以下詳細參考:

什么是原子性

即一個操作或者多個操作 要么全部執(zhí)行并且執(zhí)行的過程不會被任何因素打斷较剃,要么就都不執(zhí)行咕别。

一個很經典的例子就是銀行賬戶轉賬問題:比如從賬戶A向賬戶B轉1000元,那么必然包括2個操作:從賬戶A減去1000元写穴,往賬戶B加上1000元惰拱。這2個操作必須要具備原子性才能保證不出現(xiàn)一些意外的問題。

我們操作數(shù)據(jù)也是如此啊送,比如i = i+1偿短;其中就包括欣孤,讀取i的值,計算i昔逗,寫入i降传。這行代碼在Java中是不具備原子性的,則多線程運行肯定會出問題勾怒,所以也需要我們使用同步和lock這些東西來確保這個特性了搬瑰。

原子性其實就是保證數(shù)據(jù)一致、線程安全一部分控硼,

什么是可見性

當多個線程訪問同一個變量時,一個線程修改了這個變量的值艾少,其他線程能夠立即看得到修改的值卡乾。

若兩個線程在不同的cpu,那么線程1改變了i的值還沒刷新到主存缚够,線程2又使用了i幔妨,那么這個i值肯定還是之前的,線程1對變量的修改線程沒看到這就是可見性問題谍椅。

什么是有序性

程序執(zhí)行的順序按照代碼的先后順序執(zhí)行误堡。

一般來說處理器為了提高程序運行效率,可能會對輸入代碼進行優(yōu)化雏吭,它不保證程序中各個語句的執(zhí)行先后順序同代碼中的順序一致锁施,但是它會保證程序最終執(zhí)行結果和代碼順序執(zhí)行的結果是一致的。如下:

inta = 10;??? //語句1

intr = 2;??? //語句2

a =a + 3;? ??//語句3

r =a*a;???? //語句4

則因為重排序杖们,他還可能執(zhí)行順序為 2-1-3-4悉抵,1-3-2-4

但絕不可能 2-1-4-3,因為這打破了依賴關系摘完。顯然重排序對單線程運行是不會有任何問題姥饰,而多線程就不一定了,所以我們在多線程編程時就得考慮這個問題了孝治。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末列粪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谈飒,更是在濱河造成了極大的恐慌岂座,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件步绸,死亡現(xiàn)場離奇詭異掺逼,居然都是意外死亡,警方通過查閱死者的電腦和手機瓤介,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門吕喘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赘那,“玉大人,你說我怎么就攤上這事氯质∧贾郏” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵闻察,是天一觀的道長拱礁。 經常有香客問我,道長辕漂,這世上最難降的妖魔是什么呢灶? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钉嘹,結果婚禮上鸯乃,老公的妹妹穿的比我還像新娘。我一直安慰自己跋涣,他們只是感情好缨睡,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陈辱,像睡著了一般奖年。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沛贪,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天陋守,我揣著相機與錄音,去河邊找鬼利赋。 笑死嗅义,一個胖子當著我的面吹牛,可吹牛的內容都是我干的隐砸。 我是一名探鬼主播之碗,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼季希!你這毒婦竟也來了褪那?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤式塌,失蹤者是張志新(化名)和其女友劉穎博敬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峰尝,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡偏窝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祭往。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡伦意,死狀恐怖,靈堂內的尸體忽然破棺而出硼补,到底是詐尸還是另有隱情驮肉,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布已骇,位于F島的核電站离钝,受9級特大地震影響,放射性物質發(fā)生泄漏褪储。R本人自食惡果不足惜卵渴,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲤竹。 院中可真熱鬧奖恰,春花似錦、人聲如沸宛裕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揩尸。三九已至,卻和暖如春屁奏,著一層夾襖步出監(jiān)牢的瞬間岩榆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工坟瓢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勇边,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓折联,卻偏偏與公主長得像粒褒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诚镰,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容