<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      線程安全—相關介紹

      線程安全?

      《Java并發編程實戰(Java Concurrency In Practice)》的作者Brian Goetz為“線程安全”做出了一個比較恰當的定義:“當多個線程同時訪問一個對象時,如果不用考慮這些線程在運行時環境下的調度和交替執行,也不需要進行額外的同步,或者在調用方進行任何其他的協調操作,調用這個對象的行為都可以獲得正確的結果,那就稱這個對象是線程安全的。

      《Java并發編程之美》的作者翟陸續的定義如下:"線程安全問題是指當多個線程同時讀寫一個共享資源并且沒有任何同步措施時,導致出現臟數據或者其他不可預見的結果的問題",其中共享資源是指該資源被多個線程所持有或者說多個線程都可以去訪問該資源。

      出現線程不安全的原因是什么?

      多個線程之間存在著共享數據,那么就有可能出現線程的安全問題。是不是說多個線程共享了資源,都會產生線程安全問題呢?答案是否定的,如果多個線程都是只讀取共享資源,而不去修改,那么就不會存在線程安全問題。只有當至少一個線程修改共享資源時候才會存在線程安全問題。

      Java語言中的線程安全

      在Java語言中,線程安全具體是如何體現的?有哪些操作是線程安全的?按照線程安全的“安全程度”由強至弱來排序,我們可以將Java語言中各種操作共享的數據分為以下五類:不可變、絕對線程安全、相對線程安全、線程兼容和線程對立。

      1.不可變

      在Java語言里面(特指JDK 5以后,即Java內存模型被修正之后的Java語言),不可變 (Immutable)的對象一定是線程安全的。Java語言中,如果多線程共享的數據是一個基本數據類型,那么只要在定義時使用final關鍵字修飾 它就可以保證它是不可變的。如果共享數據是一個對象,由于Java語言目前暫時還沒有提供值類型的 支持,那就需要對象自行保證其行為不會對其狀態產生任何影響才行,不妨類比java.lang.String類的對象實例,它是一個典型的不可變對象,用戶調用它的 substring()、replace()和concat()這些方法都不會影響它原來的值,只會返回一個新構造的字符串對象。

      保證對象行為不影響自己狀態的途徑有很多種,最簡單的一種就是把對象里面帶有狀態的變量都 聲明為final,這樣在構造函數結束之后,它就是不可變的,例如java.lang.Integer 構造函數,它通過將內部狀態變量value定義為final來保障狀態不變。

      在Java類庫API中符合不可變要求的類型,除了上面提到的String之外,常用的還有枚舉類型及 java.lang.Number的部分子類(AtomicInteger和AtomicLong是可變的),如Long和Double等數值包裝類型、BigInteger和BigDecimal等大數據類型。

      2.絕對線程安全

       我們可以通過Java API中一個不是“絕對線程安全”的“線程安全類型”來看看這個語境里的“絕對”究竟是什么 意思。 如果說java.util.Vector是一個線程安全的容器,相信所有的Java程序員對此都不會有異議,因為它的add()、get()和size()等方法都是被synchronized修飾的,盡管這樣效率不高,但保證了具備原子性、 可見性和有序性。不過,即使它所有的方法都被修飾成synchronized,也不意味著調用它的時候就永遠都不再需要同步手段了。具體示例如下

       運行結果如下

      很明顯,盡管這里使用到的Vector的get()、remove()和size()方法都是同步的,但是在多線程的環境 中,如果不在方法調用端做額外的同步措施,使用這段代碼仍然是不安全的。因為如果另一個線程恰好在錯誤的時間里刪除了一個元素,導致序號i已經不再可用,再用i訪問數組就會拋出一個 ArrayIndexOutOfBoundsException異常。如果要保證這段代碼能正確執行下去,我們不得不把 removeThread和printThread的定義代碼這樣。假如Vector一定要做到絕對的線程安全,那就必須在它內部維護一組一致性的快照訪問才行,每次對其中元素進行改動都要產生新的快照,這樣要付出的時間和空間成本都是非常大的。

       

      3.相對線程安全

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

      4.線程兼容

      線程兼容是指對象本身并不是線程安全的,但是可以通過在調用端正確地使用同步手段來保證對 象在并發環境中可以安全地使用。我們平常說一個類不是線程安全的,通常就是指這種情況。Java類 庫API中大部分的類都是線程兼容的,如與前面的Vector和HashTable相對應的集合類ArrayList和 HashMap等。

      5.線程對立

      線程對立是指不管調用端是否采取了同步措施,都無法在多線程環境中并發使用代碼。由于Java 語言天生就支持多線程的特性,線程對立這種排斥多線程的代碼是很少出現的,而且通常都是有害 的,應當盡量避免。 一個線程對立的例子是Thread類的suspend()和resume()方法。如果有兩個線程同時持有一個線程對 象,一個嘗試去中斷線程,一個嘗試去恢復線程,在并發進行的情況下,無論調用時是否進行了同 步,目標線程都存在死鎖風險——假如suspend()中斷的線程就是即將要執行resume()的那個線程,那就 肯定要產生死鎖了。也正是這個原因,suspend()和resume()方法都已經被聲明廢棄了。常見的線程對立 的操作還有System.setIn()、Sytem.setOut()和System.runFinalizersOnExit()等。

      posted @ 2021-06-08 22:18  JustJavaIt  閱讀(230)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 夜色资源站www国产在线视频 | 汽车| 国产91丝袜在线播放动漫| 日本无码欧美一区精品久久| 91精品国产吴梦梦在线观看永久 | 国产精品视频不卡一区二区 | 俄罗斯少妇性XXXX另类| 欧美国产日韩久久mv| 国产精品一区二区久久精品| 亚洲中文字幕精品久久久久久动漫| 欧美不卡无线在线一二三区观| 一本色道国产在线观看二区| 国产午夜亚洲精品国产成人| 青草青草视频2免费观看| 韩国午夜福利片在线观看| 日本黄色三级一区二区三区| 乱码午夜-极品国产内射| 日本一道一区二区视频| 亚洲性图日本一区二区三区 | 亚洲va久久久噜噜噜久久狠狠| 亚洲国产午夜精品理论片| 亚洲欧洲日韩国内精品| 国产午夜精品久久久久免费视 | 娄烦县| 国产无遮挡吃胸膜奶免费看| 天堂中文8资源在线8| 国产乱妇乱子视频在播放| 久久人人97超碰精品| 久久综合伊人77777| 伊人久久大香线蕉av一区二区 | 久久理论片午夜琪琪电影网| 大地资源免费视频观看| 18禁免费无码无遮挡不卡网站 | 成人网站免费观看永久视频下载| 国产成人免费ā片在线观看| 91色老久久精品偷偷性色| 九九热在线精品视频观看| 亚洲精品日韩中文字幕| 国产精品午夜福利免费看| 亚洲精品中文字幕一区二| 国产亚洲人成网站在线观看 |