當今世界,一切都在快速發展。每件事總是有改進的空間。我們的程式語言也是如此。今天,借助現代技術,我們希望事情能夠輕鬆快速地完成。為了同時做幾件事,並發的概念出現了。那麼什麼是並發、它的用途、為什麼需要並發等等?我們將嘗試在本文中探討這些問題並單獨回答它們。因此,讓我們將討論引向一個非常基本的共同部分:並發的定義。在本主題中,我們將了解 Java 中的並發性。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
那麼並發到底是什麼?好吧,為了回答這個問題,讓我們來看一個常見的場景。假設在閱讀本文時,您嘗試同時做多件事;也許您正在嘗試做筆記,或者您正在嘗試理解它或思考一些事情。簡而言之,您正在嘗試並行執行多項操作。這就是並發的含義。並發只是並行執行多個任務。我們將在本文中討論 Java 作為程式語言的範圍內的並發性。
同時,讓我們對執行緒有一個基本的定義。其實,在Java或一般的任何程式語言中,負責承載並發的都是線程。這些執行緒的基本作用是促進任務的並行執行。
執行緒是一個輕量級進程,擁有自己的呼叫堆疊。但是,執行緒可以存取同一進程下執行的其他執行緒的共享資料。我們可以在 Java 應用程式中使用多個執行緒來實現並行處理或並發。
現在讓我們進入下一個話題,那就是…
因此,所有 OOP 語言在 Java 或任何其他程式語言(如 C#)中都有執行緒概念。在Java中,我們有不同的進程,透過建立不同的執行緒來運行以實現並發。
在這個簡單的定義之後,讓我們討論我們的新主題,即:
使 Java 應用程式並發所需的第一個類別是 java.lang.Thread 類別。 Java.lang.Thread 類別負責 Java 程式語言中的所有並發概念。之後,我們有 java.lang.Runnable 介面來從線程類別中抽像出線程行為。
我們需要建立高階應用程式的其他類別將使用 Java 1.5 中新增的 java.util.concurrent 套件。
現在,我們遇到了一個新問題...
看來在Java中實作並發是相當簡單的。然而,事實並非如此。讓我們來看看。
我們上面的討論通常給人的印像是並發是一個簡單、好的概念並且很容易實現。好吧,假設我們更好地監控它並嘗試理解它。那麼,就需要對基本概念有很好的理解,並且對我們必須實現的目標有一個透徹的理解。
讓我們比較一下並發應用程式和單執行緒應用程式。我們通常發現並發應用程式在設計和理解方面都很複雜。多執行緒執行的程式碼需要特別關注和資源來存取共享資料。由於不正確的線程同步而彈出的錯誤很難調試和修復。而且,在大多數情況下,這些錯誤在初始階段並沒有被識別出來;它是在生產模式下檢測到的,這更難重現。
除了錯誤和常見缺陷之外,並發執行緒還需要更多資源來運行應用程式。
所以基本上,由於並發而分配了兩種類型的問題。這些問題大致可以分為兩類
讓我們了解每一個。
讓我們透過一個簡單的例子來理解。
假設我們有一個計數器函數,其基本作用是增加計數器或數字的計數。假設我們有線程 A 和線程 B,線程 A 讀取的初始值為 0。現在,以下步驟按順序運行。
所以問題就出現了。兩個執行緒 A & B 執行程式碼兩次,期望值為 2,但反映為 1。這是多執行緒可能導致的主要問題。
如何解決這個問題?
執行緒幹擾錯誤可以透過同步存取共享變數來解決。我們必須與共享資料之間的更新值保持同步。
有了這個,讓我們看看第二種類型的錯誤......
記憶體不一致錯誤通常發生在不同執行緒嘗試讀取相同資料或對相同資料的視圖不一致時。這通常發生在第一個執行緒更新一些共享資料時。此更新值不會傳播到第二個或不同的線程,它們會讀取舊資料。
讓我們看看為什麼會發生這種情況。
嗯,造成這種情況的原因可能有很多。通常,編譯器通常會對應用程式進行多次最佳化以提高效能。它還可以更新指令序列以優化效能。即使在一般情況下,處理器也會嘗試最佳化程式碼;例如,CPU 可能會從快取或臨時暫存器而不是主記憶體中讀取變數的當前值。
並發性是任何 OOP 語言的一個非常重要的特性。線程允許我們並行執行多個進程。它幫助我們更快地執行複雜的任務。然而,並發也有一些缺點。使用執行緒會導致資源的大量使用。
以上是Java 中的並發的詳細內容。更多資訊請關注PHP中文網其他相關文章!