Java線程機制(五) 等待與通知機制

在之前我們關於停止Thread的討論中,曾經使用過設定標記done的做法,一旦done設定為true,線程就會 結束,一旦為false,線程就會永遠運行下去。這樣做法會消耗掉許多CPU迴圈,是一種對記憶體不友好的行為。java中的對象不僅擁有鎖,而且它們本身就可以通過調用相關方法使自己成為等待者和通知者。Object對象本身有兩個方法:wait()和notify()。wait()會等待條件的發生,而notify()會通知正在

Java線程機制(四) 同步方法和同步塊

在之前例子的基礎上,我們增加新的功能:根據正確與不正確的響應來顯示玩家的分數。public class ScoreLabel extends JLabel implements CharacterListener { private volatile int score = 0; private int char2type = -1; private CharacterSource generator = null, typist = null; public

Java多線程:“JUC原子類”02之AtomicLong原子類

AtomicLong介紹和函數列表AtomicLong是作用是對長整形進行原子操作。在32位作業系統中,64位的long 和 double 變數由 於會被JVM當作兩個分離的32位來進行操作,所以不具有原子性。而使用AtomicLong能讓long的操作保持 原子型。AtomicLong函數列表// 建構函式AtomicLong()// 建立值為initialValue的AtomicLong對象AtomicLong(long initialValue)//

Java多線程:“JUC原子類”01之架構

根據修改的資料類型,可以將JUC包中的原子操作類可以分為4類。1. 基本類型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 數群組類型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;3. 參考型別: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;4. 對象的屬性修改類型:

Java多線程:“JUC鎖”03之公平鎖(一)

基本概念本章,我們會講解“線程擷取公平鎖”的原理;在講解之前,需要瞭解幾個基本概念。後 面的內容,都是基於這些概念的;這些概念可能比較枯燥,但從這些概念中,能窺見“java鎖 ”的一些架構,這對我們瞭解鎖是有協助的。1. AQS        -- 指AbstractQueuedSynchronizer類。AQS

Java多線程:“JUC鎖”02之互斥鎖ReentrantLock

ReentrantLock介紹ReentrantLock是一個可重新進入的互斥鎖,又被稱為“獨佔鎖”。顧名思義,ReentrantLock鎖在同一個時間點只能被一個線程鎖持有;而可重新進入的意思是, ReentrantLock鎖,可以被單個線程多次擷取。ReentrantLock分為“公平鎖”和“非 公平鎖”。它們的區別體現在擷取鎖的機制上是否公平。“鎖”是為了保護競爭資源,

Java多線程:“JUC鎖”01之架構

根據鎖的添加到Java中的時間,Java中的鎖,可以分為"同步鎖"和 "JUC包中的鎖"。同步鎖即通過synchronized關鍵字來進行同步,實現對競爭資源的互斥訪問的鎖。Java 1.0版本中就已經支 持同步鎖了。同步鎖的原理是,對於每一個對象,有且僅有一個同步鎖;不同的線程能共同訪問該同步鎖。但是, 在同一個時間點,該同步鎖能且只能被一個線程擷取到。這樣,擷取到同步鎖的線程就能進行CPU調度,

深入理解Java記憶體模型(七) 總結

處理器記憶體模型順序一致性記憶體模型是一個理論參考模型,JMM和處理器記憶體模型在設計時通 常會把順序一致性記憶體模型作為參照。JMM和處理器記憶體模型在設計時會對順序一致性模型做一些放鬆, 因為如果完全按照順序一致性模型來實現處理器和JMM,那麼很多的處理器和編譯器最佳化都要被禁止,這 對執行效能將會有很大的影響。根據對不同類型讀/寫操作組合的執行順序的放鬆,可以把常見處 理器的記憶體模型劃分為下面幾種類型:放鬆程式中寫-讀操作的順序,由此產生了total store

深入理解Java記憶體模型(六) final

與前面介紹的鎖和volatile相比較,對final域的讀和寫更像是普通的變數訪問。對於final域,編譯 器和處理器要遵守兩個重定序:在建構函式內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變數,這兩個操 作之間不能重排序。初次讀一個包含final域的對象的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序。下面,我們通過一些樣本性的代碼來分別說明這兩個規則:public class FinalExample { int i;

深入理解Java記憶體模型(五) 鎖

鎖的釋放-擷取建立的happens before 關係鎖是java並發編程中最重要的同步機制。鎖除了讓 臨界區互斥執行外,還可以讓釋放鎖的線程向擷取同一個鎖的線程發送訊息。下面是鎖釋放-擷取 的範例程式碼:class MonitorExample { int a = 0; public synchronized void writer() { //1 a++; //2 }

深入理解Java記憶體模型(四) volatile

volatile的特性當我們聲明共用變數為volatile後,對這個變數的讀/寫將會很特別。理解 volatile特性的一個好方法是:把對volatile變數的單個讀/寫,看成是使用同一個監視器鎖對這些單個 讀/寫操作做了同步。下面我們通過具體的樣本來說明,請看下面的範例程式碼:class VolatileFeaturesExample { volatile long vl = 0L; //使用volatile聲明64位的long型變數 public void set(long

深入理解Java記憶體模型(三) 順序一致性

資料競爭與順序一致性保證當程式未正確同步時,就會存在資料競爭。java記憶體模型規範對數 據競爭的定義如下:在一個線程中寫一個變數,在另一個線程讀同一個變數,而且寫和讀沒有通過同步來排序。當代碼中包含資料競爭時,程式的執行往往產生違反直覺的結果(前一章的樣本正是如此)。如果一 個多線程程式能正確同步,這個程式將是一個沒有資料競爭的程式。JMM對正確同步的多線程程式 的記憶體一致性做了如下保證:如果程式是正確同步的,程式的執行將具有順序一致性(sequentially

深入理解Java記憶體模型(二) 重排序

如果兩個操作訪問同一個變數,且這兩個操作中有一個為寫操作,此時這兩個操作之間就存在資料依 賴性。資料依賴分下列三種類型:上 面三種情況,只要重排序兩個操作的執行順序,程式的執行結果將會被改變。前面提到過,編譯 器和處理器可能會對操作做重排序。編譯器和處理器在重排序時,會遵守資料依賴性,編譯器和處理器不 會改變存在資料依賴關係的兩個操作的執行順序。注意,這裡所說的資料依賴性僅針對單個處理 器中執行的指令序列和單個線程中執行的操作,不同處理器之間和不同線程之間的資料依賴性不被編譯器

深入理解Java記憶體模型(一) 基礎

並發編程模型的分類在並發編程中,我們需要處理兩個關鍵問題:線程之間如何通訊及線程之 間如何同步(這裡的線程是指並發執行的活動實體)。通訊是指線程之間以何種機制來交換資訊。在命令 式編程中,線程之間的通訊機制有兩種:共用記憶體和訊息傳遞。在共用記憶體的並行存取模型裡,線程 之間共用程式的公用狀態,線程之間通過寫-讀記憶體中的公用狀態來隱式進行通訊。在訊息傳遞的並發模 型裡,線程之間沒有公用狀態,線程之間必須通過明確的發送訊息來顯式進行通訊。同步是指程 序用於控制不同線程之間操作發生相對順序的機制。

Java異常處理機制

異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。比如說,你用System.out.println(5/0),那麼你是因為你用0做了除數,會拋出java.lang.ArithmeticException的異常。

深入探索Java熱部署

簡介在 Java 開發領域,熱部署一直是一個難以解決的問題,目前的 JAVA 虛擬機器只能實現 方法體的修改熱部署,對於整個類的結構修改,仍然需要重啟虛擬機器,對類重新載入才能完成更新操作。 對於某些大型的應用來說,每次的重啟都需要花費大量的時間成本。雖然 osgi 架構的出現,讓模組重啟 成為可能,但是如果模組之間有調用關係的話,這樣的操作依然會讓應用出現短暫的功能性休克。本文將 探索如何在不破壞 JAVA 虛擬機器現有行為的前提下,實現某個單一類的熱部署,讓系統無需重啟就完成某 個類的更新。

Java IO流基礎

輸入輸出資料流想必大家已經用的非常熟練了,但是,我們往往忽略了身邊最熟悉的一些東西,又或者我 們只知道要這樣做,卻不知道為什麼這麼做,所以在這裡跟大家分享一下在網路編程當中看到的一些關於 I/O流的細節,閑話不多說,下面開始:OutputStream,顧名思義:輸出資料流,它的子類使用所提供的方法向某種媒體寫入資料,例如, FileOutputStream將資料寫入檔案,TelnetOutputStream將資料寫入網路連接,不過聽到這大家會問了,

實現Java中的高效能解析器

在某些情況下,你可能需要在Java中實現你自己的資料或語言解析器,也許是這種資料格式或語言缺乏標準的Java或開源解析器可以使用。或者雖然有現成的解析器實現,但它們要麼太慢,要麼太占記憶體,要麼就是沒有符合你所需要的特性。又或者是某個開源的解析器存在缺陷,要麼是某個開源解析器的項目中止了,原因不一而足。不過無論原因是什麼,總之事實就是你必須要自己去實現這個解析器。當你必須自己實現一個解析器時,你對它的期望會有很多,包括效能良好、靈活、特性豐富、方便使用,以及便於維護等等。說到底,這也是你自己的代

在Java中使用啟發學習法搜尋更快地解決問題

瞭解一個流行人工智慧搜尋演算法的 Java 實現通過搜尋可行解決方案空間來解決問題是人工智慧中一項名為狀態空間搜尋 的基本技術。 啟發學習法搜 索 是狀態空間搜尋的一種形式,利用有關一個問題的知識來更高效地尋找解決方案。啟發學習法搜尋在各個 領域榮獲眾多殊榮。在本文中,我們將向您介紹啟發學習法搜尋領域,並展示如何利用 Java 程式設計語言實現 A*,即最廣為使用的啟發學習法搜尋演算法。啟發學習法搜尋演算法對計算資源和記憶體提出了較高的要求。我們還將展

Java支援白名單功能

白名單是一個讓大家期待已久的功能。甲骨文為Java添加一個讓大家久等的功能“Deployment Rule Set”(部署規則集),即支援白名單。Java 7 Update

總頁數: 4058 1 .... 2790 2791 2792 2793 2794 .... 4058 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.