Java 中的原子操作
寫這篇部落格起源於一道面試題 i++ 是不是原子操作?
那到底什麼是原子操作?
所謂原子操作,就是“不可中斷的一個或一系列操作”。在確認一個操作是原子的情況下,在多執行緒環境裡,我們可以避免僅僅為保護這個操作在外圍加上效能昂貴的鎖,甚至藉助於原子操作,我們可以實現互斥鎖。
Java中有哪些原子操作呢?查詢資料後我總結出了以下幾個:
- 原始型別:原始型別(long 和 double 的賦值操作在32位作業系統上是非原子操作)的簡單讀取、寫入操作(i++是非原子操作)。
- volatile:使用volatile修飾的變數的簡單讀取、寫入操作。
- 原子類:原子類(例如AtomicInteger、AtomicBoolean)的讀取、寫入操作,注意incrementAndGet自增操作具有原子性。
- 併發鎖:使用synchronize或者Lock進行限定的併發鎖,其中的程式碼都具有原子性。
注意:volatile並不保證原子性,所以即使變數有volatile修飾,對變數的“複雜”操作並不是原子操作,即保證簡單讀取、寫入操作是原子操作。
相關推薦
Java併發中原子操作的實現
處理器實現原子操作 如果多個處理器同時對共享變數進行讀改寫(i++就是經典的讀改寫操作)操作,那麼共享變數就會被多個處理器同時進行操作,這樣讀改寫操作就不是原子的,所以要保證操作是原子性,則必須保證同一時刻只有一個處理器訪問共享變數的記憶體地址。 使用匯流
處理器如何實現原子操作 java 實現原子操作 轉載
原文地址:http://www.infoq.com/cn/articles/atomic-operation 1. 引言 原子(atom)本意是“不能被進一步分割的最小粒子”,而原子操作(atomic operation)意為"不可被中斷的一個或一系列操作" 。在多處理器上
Java中檔案操作
java提供了一些實現類對檔案進行操作 File 對具體檔案(目錄)進行抽象表示。File類只用於表示檔案或者目錄的資訊(名稱、大小),不能用於檔案內容的訪問。 file類的方法比較多,以一個例項演示常用的幾個API。 import java.io.F
關於C11標準中原子操作,看這篇就夠了!
6月18日,由CocoaChina主辦,Intel獨家贊助的以“那些開發領域的新玩意”為主題的CVP系列開發者沙龍圓滿落幕。沙龍上,CocoaChina社群名版主zenny_chen帶來了《C11標準中原子操作簡介》為主題的精彩分享。 以下為演講實錄: zenny_chen:很高興跟大家分享
java中bit操作常用技巧
1. bit:位 一個二進位制資料0或1,是1bit; 2. byte:位元組 儲存空間的基本計量單位,如:MySQL中定義 VARCHAR(45) 即是指 45個位元組; 1 byte = 8 bit 3. 一個英文字元佔一個位元組;
Java 併發 ---原子操作的實現原理
注:本文部分參考了 java 併發程式設計的藝術一書 併發這塊反覆研究挺久了,原始碼也研究了一部分,總覺得缺乏一點認識,想了許久還是總結出來,這樣也有助於自己理解 原子操作意思為不可被中斷的一個或一系列操作 在瞭解原子操作的實現原理前,先要了解一下相關的術
MongoDB學習筆記(三) java中如何操作MongoDB
1. mongoDB對Java支援的驅動包 驅動包下載地址:http://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/ mongoDB對Java的相關支援、技術:http://www.mongodb.org/di
ARM體系結構中原子操作 ATOMIC 的實現
關於整數 的原子操作,對於Atomic_t型別,一直以來,記得書上說的都是要不CPU體系結構本身支援簡單的原子操作,要不提供了鎖記憶體匯流排功能,可以在操作期間,防止對資料的訪問發生。 今天突然想到,ARM架構本身不提供鎖記憶體匯流排功能,也沒有類似的原子操作的指令,那麼如何
JAVA中檔案操作大全
一.獲得控制檯使用者輸入的資訊/**//** *//**//**獲得控制檯使用者輸入的資訊 * @return * @throws IOException */ public String getInputMessage() throws IOException......{
Java中原子類的實現
Java提供的原子類是靠sun基於CAS實現的,CAS是一種樂觀鎖。關於樂觀鎖與悲觀鎖。 原子變數類相當於一種泛化的volatile變數,能夠支援原子的和有條件的讀-改-寫操作。AtomicInteger表示一個int型別的值,並提供了get和set方法,這些Vol
C++11中原子操作atomic
所謂的原子操作,取的就是“原子是最小的、不可分割的最小個體”的意義,它表示在多個執行緒訪問同一個全域性資源的時候,能夠確保所有其他的執行緒都不在同一時間內訪問相同的資源。也就是他確保了在同一時刻只有唯一的執行緒對這個資源進行訪問。這有點類似互斥物件對共享資源的訪問的保護,但是原子操作更加接近底層,因而效率更高
Java中String操作
字串操作 ------------建立字串-------------- new String() new String(char
Java中陣列操作 java.util.Arrays 類常用方法的使用
任何一門程式語言,陣列都是最重要和常用的資料結構之一,但不同的語言對陣列的構造與處理是不盡相同的。 Java中提供了java.util.Arrays 類能方便地運算元組,並且它提供的所有方法都是靜態的。下面介紹一下Arrays類最常用的幾個方法。 1. 陣列排序 Arrays工具類提供了一個sor
File類的特點?如何建立File類物件?Java中如何操作檔案內容,什麼是Io流Io流如何讀取和寫入檔案?位元組緩衝流使用原則?
重難點提示 學習目標 1、能夠了解File類的特點(存在的意義,構造方法,常見方法) 2、能夠了解什麼是IO流以及分類(IO流的概述以及分類)
【Java併發】Java中的原子操作
Java中的原子操作 原子更新基本型別 原子更新陣列 原子更新引用型別 原子更新欄位類 參考 原子更新基本型別 一個生動的例子 public class AtomicIntegerExample { privat
Java併發程式設計(十一)Java中的原子操作類
一、原子操作類簡介 JDK1.5開始提供了java.util.concurrent.atomic包,其中有一系列用法簡單、效能高效、可以執行緒安全更新變數的原子操作類,目前(JDK1.7)大概有這麼些: 二、原子操作類實現原理 以AtomicInteger為例看下原始碼,其中的兩個
Java 中的原子操作
寫這篇部落格起源於一道面試題 i++ 是不是原子操作? 那到底什麼是原子操作? 所謂原子操作,就是“不可中斷的一個或一系列操作”。在確認一個操作是原子的情況下,在多執行緒環境裡,我們可以避免僅僅為保護這個操作在外圍加上效能昂貴的鎖,甚至藉助於原子操作,我們可以實現互斥鎖。 Jav
多執行緒學習筆記十三——java中的原子操作類
當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變 量i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因 為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全
併發:Java中的13個原子操作類。
當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變數i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全的更新操作,通常我們會使用synchronized
java併發中的原子變數和原子操作以及CAS介紹
很多情況下我們只是需要一個簡單的、高效的、執行緒安全的遞增遞減方案。注意,這裡有三個條件:簡單,意味著程式設計師儘可能少的操作底層或者實現起來要比較容易;高效意味著耗用資源要少,程式處理速度要快;執行緒安全也非常重要,這個在多執行緒下能保證資料的正確性。這三個條件看起來比較簡單,但是實現起來卻難