日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

線程安全這個(gè)名稱,相信稍有經(jīng)驗(yàn)的程序員都會聽說過,甚至在代碼編寫和走查的時(shí)候可能還會經(jīng)常掛在嘴邊,并且在面試中是問的最多的,但凡有處理線程安全問題經(jīng)驗(yàn)豐富的程序員,都會很吃香。線程安全怎么來定義呢?一本書中曾做過定義:“當(dāng)多個(gè)線程訪問一個(gè)對象時(shí),如果不用考慮這些線程在運(yùn)行時(shí)環(huán)境下的調(diào)度和交替執(zhí)行,也不需要進(jìn)行額外的同步,或者在調(diào)用方進(jìn)行任何其他的協(xié)調(diào)操作,調(diào)用這個(gè)對象的行為都可以獲得正確的結(jié)果,那這個(gè)對象是線程安全的”。

今天就來說一說JAVA語言中的線程安全,線程安全問題,無非就是對共享數(shù)據(jù)的處理,在Java語言中,處理共享數(shù)據(jù)可以分為:不可變、絕對線程安全、相對線程安全、線程兼容和線程對立。

一、不可變

在Java語言中,不可變 (Immutable)的對象一定是線程安全的,無論是對象的方法實(shí)現(xiàn)還是方法的調(diào)用者,都不需要再采取任何的線程安全保障措施,只要一個(gè)不可變的對象被正確地構(gòu)建出來,那 其外部的可見狀態(tài)永遠(yuǎn)也不會改變,永遠(yuǎn)也不會看到它在多個(gè)線程之中處于不一致的狀態(tài)。“不可變”帶來的安全性是最簡單和最純粹的。如果共享數(shù)據(jù)是一個(gè)基本數(shù)據(jù)類型,那么只要在定義時(shí)使用final關(guān)鍵字修 飾它就可以保證它是不可變的。如果共享數(shù)據(jù)是一個(gè)對象,那就需要保證對象的行為不會對 其狀態(tài)產(chǎn)生任何影響才行,大家都熟悉java.lang.String類的對象,它是一個(gè)典型的不可變對象,我們調(diào)用它的substring()、replace()和concat()這些方法都不會影響它原來的值,只會返回一個(gè)新構(gòu)造的字符串對象。

線程安全問題無大小:Java中的線程安全之操作共享數(shù)據(jù)分類

 

保證對象行為不影響自己狀態(tài)的途徑有很多種,其中最簡單的就是把對象中帶有狀態(tài)的變量都聲明為final,這樣在構(gòu)造函數(shù)結(jié)束之后,它就是不可變的,比如java.lang.Integer的構(gòu)造函數(shù),它通過將內(nèi)部狀態(tài)變量value定義為final來保障狀態(tài)不變。

線程安全問題無大小:Java中的線程安全之操作共享數(shù)據(jù)分類

 

二、絕對線程安全

絕對的線程安全就是要完全滿足:一個(gè)類要達(dá)到“不管運(yùn)行時(shí)環(huán)境如何,調(diào)用者都不需要任何額外的同步措施”通常需要付出很大的,甚至有時(shí)候是不切實(shí)際的代價(jià)。在Java API中標(biāo)注自己是線程安全的類,大多數(shù)都不是絕對的線程安全。java.util.Vector是一個(gè)線程安全的容器,因?yàn)樗腶dd()、get()和size()這類方法都是被synchronized修飾的,盡管這樣效率很低,但確實(shí)是安全的。但是,即使它所有的方法都被修飾成同步,也不意味著調(diào)用它的時(shí)候永遠(yuǎn)都不再需要同步手段了。

線程安全問題無大小:Java中的線程安全之操作共享數(shù)據(jù)分類

 

假如我們在另外一個(gè)A方法中調(diào)用Vector類中的線程安全的方法,如果 A方法不加synchronized關(guān)鍵字,這個(gè)A方法也是線程非安全的。

三、相對線程安全

相對的線程安全就是我們通常意義上所講的線程安全,它需要保證對這個(gè)對象單獨(dú)的操作是線程安全的,我們在調(diào)用的時(shí)候不需要做額外的保障措施,但是對于一些特定順序的連 續(xù)調(diào)用,就可能需要在調(diào)用端使用額外的同步手段來保證調(diào)用的正確性。在Java語言中,大部分的線程安全類都屬于這種類型,例如Vector、HashTable、Collections的synchronizedCollection()方法包裝的集合等。

四、線程兼容

線程兼容是指對象本身并不是線程安全的,但是可以通過在調(diào)用端正確地使用同步手段來保證對象在并發(fā)環(huán)境中可以安全地使用,我們平常說一個(gè)類不是線程安全的,絕大多數(shù)時(shí)候指的是這一種情況。Java API中大部分的類都是屬于線程兼容的,如與前面的Vector和HashTable相對應(yīng)的集合類ArrayList和HashMap等。

五、線程對立

線程對立是指無論調(diào)用端是否采取了同步措施,都無法在多線程環(huán)境中并發(fā)使用的代碼。由于Java語言天生就具備多線程特性,線程對立這種排斥多線程的代碼是很少出現(xiàn)的,而且通常都是有害的,應(yīng)當(dāng)盡量避免。一個(gè)線程對立的例子是Thread類的suspend()和resume()方法,如果有兩個(gè)線程同時(shí)持有一個(gè)線程對象,一個(gè)嘗試去中斷線程,另一個(gè)嘗試去恢復(fù)線程,如果并發(fā)進(jìn)行的話,無論調(diào)用時(shí)是否進(jìn)行了同步,目標(biāo)線程都是存在死鎖風(fēng)險(xiǎn)的,如果suspend()中斷的線程就是即將要執(zhí)行resume()的那個(gè)線程,那就肯定要產(chǎn)生死鎖了。也正是由于這個(gè)原因,suspend()和resume()方法已經(jīng)被JDK聲明廢(@Deprecated)了。常見的線程對立的操作還有System.setIn()、Sytem.setOut()和
System.runFinalizersOnExit()等。

線程安全問題無大小:Java中的線程安全之操作共享數(shù)據(jù)分類

 

面向過程的編程思想極大地提升了現(xiàn)代軟件開發(fā)的生產(chǎn)效率和軟件可以達(dá)到的規(guī)模,但是現(xiàn)實(shí)世界與計(jì)算機(jī)世界之間不可避免地存在一些差異。有時(shí)候,良好的設(shè)計(jì)原則不得不向現(xiàn)實(shí)做出一些讓步,我們必須讓程序在計(jì)算機(jī)中正確無誤地運(yùn)行,然后再考慮如何將代碼組織得更好,讓程序運(yùn)行得更快。專業(yè)一點(diǎn)講,就是高效并發(fā),高效并發(fā)首先需要保證并發(fā)的正確性,然后在此基礎(chǔ)上實(shí)現(xiàn)高效。所以對于線程并發(fā)安全問題的一些基礎(chǔ)知識,我們需要扎實(shí)的進(jìn)行了解。

分享到:
標(biāo)簽:線程
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定