1. 程式人生 > >Java併發學習筆記(九)-原子類AtomicInteger

Java併發學習筆記(九)-原子類AtomicInteger

AtomicInteger能夠保證對一個整型的操作是原子性。像i++這個操作不是原子操作,存在競態條件,所以需要加鎖,但是加鎖的效能不高,如果僅僅為了對一個整數加1。我們來看下他的實現。

    private volatile int value;

AtomicInteger本身持有一個整型變數,所有的操作都是基於這個變數的。變數由violate修飾,這個變數是保證可見性的,具體可見另一篇部落格

來看一下對value加1的操作

    public final int getAndIncrement() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }

程式碼巢狀在一個for迴圈裡,關鍵是在compareAndSet方法裡。這個方法會託管給unsafe的compareAndSwapInt方法,這個步驟是靠硬體支援的,是原子操作。這個方法的意思是,如果value等於current,那麼將value置為next,返回true,否則返回false,繼續下一輪迴圈。為什麼會出現值不一致,原因就在競態條件,當本執行緒將value值賦給current後,其它執行緒可能修改了value的值,這樣就會出現current和value不一致的情況。可以看出來compareAndSet類似樂觀鎖,及時失敗。總結來說就是,value的可見性由voilate保證,原子性操作由compareAndSet來保證。

其它的方法,操作也類似,都是依靠compareAndSet來保證


相關推薦

Java併發學習筆記()-原子AtomicInteger

AtomicInteger能夠保證對一個整型的操作是原子性。像i++這個操作不是原子操作,存在競態條件,所以需要加鎖,但是加鎖的效能不高,如果僅僅為了對一個整數加1。我們來看下他的實現。 private volatile int value; AtomicInte

java入門學習筆記之1(的定義,代碼的編譯執行)

spa hex nts 自動調用 [] alt vim 進制 技術 這篇文章講解Java代碼的基本執行過程 我們先拋開各種JAVA IDE,開發工具,只使用文本編輯器,以突出最本質的東西。 在Linux環境下,我們編輯一個文件: vim HelloWorld.java

Java併發學習筆記

一、程序 執行緒 程序:一個程序來對應一個程式, 每個程序對應一定的記憶體地址空間,並且只能使用它自己的記憶體空間,各個程序間互不干擾。 程序儲存了程式每個時刻的執行狀態,這樣就為程序切換提供了可能。當程序暫停時,它會儲存當前程序的狀態(比如程序標識、程序的使用的資源等),在下一次重新切換回來時,便根據之前儲

Java併發學習筆記(二)-Executor捕獲異常機制

學習《java程式設計思想》的Executor捕獲異常的時候,發現程式碼輸出跟書上有出入,於是就研究了一下Executor的機制。 (一)異常捕獲例項 1、異常處理類MyUncaughtExceptionHandler public class MyUncaughtExc

Java併發學習筆記(八)-LinkedBlockingQueue

LinkedBlockingQueue是由連結串列組成的阻塞佇列,先來看demo public class LinkedBlockingQueueDemo { public static void main(String[] args) { ExecutorServ

Java併發學習筆記(四)-柵欄CyclicBarrier

閉鎖是一次性物件,一旦進入終止狀態,就不能被重置,它是用來啟動一組相關的操作,或者等待一組相關的操作結束。 柵欄跟閉鎖有點類似,它能阻塞一組執行緒直到某個時間發生,但是這裡有個很大的區別,在柵欄裡,只有這組執行緒都到達柵欄位置時,才能繼續執行 public class C

機器學習筆記()聚

9.聚類 有必要回顧下前文所涉及的機器學習主流分類,有監督學習中根據預測結果離散和連續屬性分為分類和迴歸兩大類,常見的演算法有:線性模型、決策樹、神經網路、支援向量機、貝葉斯分類器以及整合學習。 本文開始說無監督學習(unsupervised learning),訓練樣本的

Java SE 學習筆記()

1.      介面(interface) : 一個類只能有一個父類, 但是可以實現多個介面 2.      多型(polymorphism) : 多型的前提: 必須存在繼承或者實現關係 3.      多型情況下的訪問 : a)        多型情況下, 子類和

java併發學習筆記2】

(一)基本概念 1.同步和非同步: 同步(Sync) 所謂同步,就是發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回或繼續執行後續操作。 簡單來說,同步就是必須一件一件事做,等前一件做完了才能做下一件事。 例如:B/S模式中的表單提交,具體過程是:客戶端提交請

Java併發學習筆記 —— 淺析Java中的鎖

引言 在多執行緒環境下,為了保證共享變數的原子性操作,我們需要鎖來保證資源的獨佔;在資料庫連線等資源不足的情況下,我們需要控制獲取連線的資源數以防出現異常;還有一些情況下,我們需要多個執行緒任務完成的條件滿足後再繼續程式……在以上的種種情況,我們都需

Java併發學習()-AtomicIntegerFieldUpdater欄位原子更新

前面講的兩個AtomicInteger和AtomicIntegerArray,這兩個都是在最初設計編碼時候就已經考慮到了需要保證原子性。但是往往有很多情況就是,由於需求的更改,原子性需要在後面加入,類似於我不要求你這整個類操作具有原子性,我只要求你裡面一個欄位操

原始碼學習原子AtomicIntegerJava原子底層實現(解釋詳細)

原子類AtomicInteger 在Java中,有很多方法可以保證多執行緒下資料的安全,AtomicXXXX這些類就是其中的一種,原子類,可以保證每一步操作都是原子操作。這次就對AtomicInteger的原始碼進行學習。 首先看一下這個類的類變數和成員變數

深入理解Java虛擬機- 學習筆記 - 虛擬機加載機制

支持 pub eth 獲取 事件 必須 string 沒有 字節碼 虛擬機把描述類的數據從Class文件加載道內存,並對數據進行校驗,轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。在Java裏,類型的加載、連接和初始化過程都是在程序

java 核心學習筆記(四) 單例

com null tools 初始化 equal inf div 特殊 對象 如果一個類始終只能創建一個實例,那麽這個類被稱作單例類。 一些特殊的應用場景可能會用到,為了保證只能創建一個實例,需要將構造方法用private修飾,不允許在類之外的其它地方創建類的實例。 又要保

Java學習筆記七---父構造方法有無參數對子的影響

als core npr 筆記 java學習筆記 def 權限 必須 void 子類不繼承父類的構造方法,但父類的構造方法對子類構造方法的創建有影響。具體來說就是: ①.當父類沒有無參構造方法時,子類也不能有無參構造方法;且必須在子類構造方法中顯式以super(參數)的形式

Java原子AtomicInteger實現原理的一點總結

sync add cef 比較 and offset active 基本 即時編譯 java原子類不多,包路徑位於:java.util.concurrent.atomic,大致有如下的類: java.util.concurrent.atomic.AtomicBoolean

java學習筆記之System

系統 arr 操作系統 ring system tro separate rate java學習筆記 System類常用總結 System類概述   java.lang.System類,系統屬性信息工具類 常用靜態方法:   1. 1 public static long

Java學習筆記—JVM的加載機制

throws syn pan 字段 失敗 git 搜索範圍 全限定名 主動使用 1 什麽是類的加載 類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數

Thinking in Java第七章學習筆記----復用

obj class 都是 一個 per private gpo toon on() 復用代碼,即使用已經開發並調試好的類。組合和繼承是兩種實現方法。 組合語法:   在新類中創建現有類的對象。該方法只是復用了現有代碼的功能,而非它的形式。   組合的例子隨處可見,這裏不舉例

Java-Web學習筆記(第章)

port pac clas tle code lang tran RR req 一:自定義標簽庫(步驟)1>開發自定義標簽類(編寫一個實現SimpleTagSupport接口的java類) package book07; import java.io.IOExcep