91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣解析java多線程編程

發布時間:2021-10-21 14:01:56 來源:億速云 閱讀:126 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關怎樣解析java多線程編程,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Java基礎學習:java多線程編程視頻

進程:一個正在執行的程序.每個進程執行都有一個執行順序,該順序是一個執行路徑,或叫一個控制單元.一個進程至少有一個線程.

線程:就是進程中的一個獨立的控制單元.線程控制這進程的執行.

多進程的缺點:進程切換開銷大;進程間的通信很不方便。

多線程:指的是在單個程序中可以同時運行多個不同的線程,執行不同的任務,線程切換的開銷小。

線程的生命周期

Java做了很多工作,力求把這些細節抽象化。Java提供了一個名為Thread.State的枚舉類型,囊括了操作系統看到的線程狀態。Thread.State中的值概述了一個線程的生命周期。

NEW

已經創建線程,但還沒在線程對象上調用start()方法。所有線程一開始都處于這個狀態。

RUNNABLE

線程正在運行,或者當操作系統調度線程時可以運行。

Java實現內存管理和并發編程的方式。

BLOCKED阻塞狀態

線程中止運行,因為它在等待獲得一個鎖,以便進入聲明為synchronized的方法或代碼塊。

具備運行資格,沒有執行權。

WAITING

線程中止運行,因為它調用了Object.wait()或Thread.join()方法。

在sleep和wait時,既沒有運行資格,有沒有執行權。

TIMED_WAITING

線程中止運行,因為它調用了Thread.sleep()方法,或者調用了Object.wait()或Thread.join()方法,而且傳入了超時時間。

TERMINATED

線程執行完畢。線程對象的run()方法正常退出,或者拋出了異常。

可見性和可變性

在Java中,其實一個進程中的每個Java應用線程都有自己的棧(和局部變量),不過這些線程共用同一個堆,因此可以輕易在線程之間共享對象,畢竟需要做的只是把引用從一個線程傳到另一個線程。

由此引出Java的一個一般設計原則——對象默認可見。如果我有一個對象的引用,就可以復制一個副本,然后將其交給另一個線程,不受任何限制。Java中的引用其實就是類型指針,指向內存中的一個位置,而且所有線程都共用同一個地址空間,所以默認可見符合自然規律。

除了默認可見之外,Java還有一個特性對理解并發很重要——對象是可變的(mutable),對象的內容(實例字段的值)一般都可以修改。使用final關鍵字可以把變量或引用聲明為常量,但這種字段不屬于對象的內容。

這兩個特性(跨線程可見性和對象可變性)結合在一起,大大增加了理解Java并發編程的難度。

并發編程的安全性

如果我們想編寫正確的多線程代碼,得讓程序滿足一個重要的條件,

即:在一個程序中,不管調用什么方法,也不管操作系統如何調度應用線程,一個對象看到的任何其他對象都不處于非法或不一致的狀態,這樣的程序才稱得上是安全的多線程程序。

互斥(mutualexclusion)和狀態保護

只要修改或讀取對象的過程中,對象的狀態可能不一致,這段代碼就要受到保護。為了保護這種代碼,Java平臺只提供了一種機制:互斥。

Java為開發者提供了synchronized關鍵字。這個關鍵字可以用在代碼塊或方法上,使用時,Java平臺會限制訪問代碼塊或方法中的代碼。

因為synchronized關鍵字把代碼包圍起來,所以很多開發者認為,Java的

并發和代碼有關。有些資料甚至把synchronized修飾的塊或方法中的代碼

稱為臨界區,還認為臨界區是并發的關鍵所在。其實不然,稍后會看到,其

實我們要防范的是數據的不一致性。

Java平臺會為它創建的每個對象記錄一個特殊的標記,這個標記叫監視器(monitor)。synchronized使用這些監視器(或叫鎖)指明,隨后的代碼可以臨時把對象渲染成不一致的狀態。synchronized修飾的代碼塊或方法會發生一系列事件,詳述如下:

線程需要修改對象時,會臨時把對象變成不一致狀態;

線程獲取監視器,指明它需要臨時互斥存儲這個對象;

線程修改對象,修改完畢后對象處于一致的合法狀態;

線程釋放監視器。

同步是保護狀態的一種協助機制,因此非常脆弱。一個缺陷(需要使用

synchronized修飾的方法卻沒有使用)就可能為系統的整體安全性帶來災難

性的后果。

之所以使用synchronized這個詞作為“需要臨時互斥存儲”的關鍵詞,除了說明需要獲取監視器之外,還表明進入代碼塊時,JVM會從主內存中重新讀取對象的當前狀態。類似地,退出synchronized修飾的代碼塊或方法時,JVM會刷新所有修改過的對象,把新狀態存入主內存。

volatile關鍵字

Java還提供了另一個關鍵字,用來并發訪問數據——volatile。這個關鍵字指明,應用代碼使用字段或變量前,必須重新從主內存讀取值。同樣,修改使用volatile修飾的值后,在寫入變量之后,必須存回主內存。

volatile關鍵字的主要用途之一是在“關閉前一直運行”模式中使用。編寫多線程程序時,如果外部用戶或系統需要向處理中的線程發出信號,告訴線程在完成當前作業后優雅關閉線程,那么就要使用volatile。這個過程有時叫作“優雅結束”模式。

上述就是小編為大家分享的怎樣解析java多線程編程了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

耿马| 苏尼特左旗| 会东县| 阳东县| 甘洛县| 会昌县| 桃园县| 凤冈县| 南开区| 年辖:市辖区| 承德市| 壤塘县| 九龙城区| 四子王旗| 建瓯市| 宁晋县| 杭锦旗| 慈利县| 新建县| 宁陕县| 旺苍县| 裕民县| 榆中县| 郯城县| 东兰县| 兴安县| 巨野县| 祁门县| 鄂托克旗| 马边| 衢州市| 洪洞县| 揭东县| 四子王旗| 昌都县| 尉氏县| 承德县| 望城县| 遵化市| 新余市| 桂平市|