Java中是如何實現原子操作的?
原子(atomic)在物理上的定義是,不能被分割的最小的粒子。而在Java中,原子操作指的是不能被中斷的一個或一系列操作。那麼Java裡面是如何實現原子操作的呢?
第一個方法是迴圈CAS
先簡單說明一下什麼是CAS。
CAS即compare and swap,比較並交換。CAS操作包含三個運算元:記憶體位置(V),預期原值(A),新值(B)。比較和交換就體現在這三個運算元上面,如果記憶體位置的值與預期原值相匹配,那麼處理器會自動將新值更新到該記憶體位置,如果不匹配,處理器就不做操作。JVM中的CAS操作也正是利用了處理器提供的cmpxchg指令來實現的。
下面看一段迴圈CAS的程式碼來做進一步的瞭解:
最終結果不一致的原因是多個處理器同時從自己的快取中讀取變數i,各自加1後又放入記憶體,unsafeCount()方法不能保證原子性,因為多個處理器有可能同時執行i++操作,所以結果就如圖所示。
從JDK 1.5開始,併發包裡提供了一些類來支援原子操作,比如剛用到的AtomicInteger類。
第二個方法是鎖
鎖機制保證了只有獲得鎖的執行緒才可以操作鎖定的記憶體區域。JVM中除了偏向鎖,其他的鎖都用了迴圈CAS的方式來獲取鎖和釋放鎖。
相關推薦
【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併發程式設計的藝術》筆記四——Java如何實現原子操作.md
在Java中可以通過鎖和迴圈CAS的方式實現原子操作。 注:CAS(比較與交換,Compare and swap) 是一種有名的無鎖演算法。CAS的語義是“我認為V的值應該為A,如果是,那麼將V的值更新為B,否則不修改並告訴V的值實際為多少”,CAS是一種 樂觀鎖 技術,當多個執行緒
Java中關於原子操作和volatile關鍵字
研究ThreadPoolExecutor的時候,發現其中大量使用了volatile變數。不知為何,因此做了一番查詢,研究: 其中借鑑了很多網上資料。 在瞭解volatile變數作用前,先需要明白一些概念: 什麼是原子操作? 所謂原子操作,就是"不可中斷的一個或一系列操作
【併發程式設計】Java中的原子操作
什麼是原子操作 原子操作是指一個或者多個不可再分割的操作。這些操作的執行順序不能被打亂,這些步驟也不可以被切割而只執行其中的一部分(不可中斷性)。舉個列子: //就是一個原子操作 int i = 1; //非原子操作,i++是一個多步操作,而且是可以被中斷的。 //i++可以被分割成3步,第一步讀取i的值,
Java中是如何實現原子操作的?
原子(atomic)在物理上的定義是,不能被分割的最小的粒子。而在Java中,原子操作指的是不能被中斷的一個或一系列操作。那麼Java裡面是如何實現原子操作的呢? 第一個方法是迴圈CAS 先簡單說明一下什麼是CAS。 CAS即compare and swap,比
java中實現對時間的操作
所屬類別:類的成員變數與方法、構造方法 題目: 在程式中經常要對時間進行操作但是並沒有時間型別的資料。 那麼我們可以自己實現一個時間類來滿足程式中的需要。 定義名為MyTime的類其中應有三個整型成員時hour分minute秒second為了保證資料的安全性這三個成員
處理器如何實現原子操作 java 實現原子操作 轉載
原文地址:http://www.infoq.com/cn/articles/atomic-operation 1. 引言 原子(atom)本意是“不能被進一步分割的最小粒子”,而原子操作(atomic operation)意為"不可被中斷的一個或一系列操作" 。在多處理器上
Java併發程式設計-原子操作的實現原理
原子(atomic)本意時“不能被進一步分割的最小粒子”,而原子操作(atomic operation)意為“不可被中斷的一個或一系列操作”。 Java 如何實現原子操作 在 Java 中可以通過鎖和迴圈 CAS 的方式實現原子操作。 1、使用迴圈 CAS 實現原子操作 JVM 中的 CAS 操作
java中cookie的操作(通過cookie實現簡單的單點登入)
package com.njupt.sso.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.h
24.Java中atomic包中的原子操作類總結
tun 添加 原來 說明 array 內存地址 void rri delta 1. 原子操作類介紹 在並發編程中很容易出現並發安全的問題,有一個很簡單的例子就是多線程更新變量i=1,比如多個線程執行i++操作,就有可能獲取不到正確的值,而這個問題,最常用的方法是通過Sy
ElasticSearch學習(八)在Java應用中實現批量操作(mget&bulk)和查詢刪除、match_all(查詢所有)
//mget批量查詢 @Test public void test6() throws Exception { //指定ES叢集 Settings settings = Settings.builder().put("clus
Java中實現String.padLeft和String.padRight
toc 還要 color for 失去 1-1 arraycopy ace pre 因為習慣了C#中的padLeft和padRight,接觸Java後突然失去這兩個功能,覺得別扭,就試著實現了這兩個方法。 Java中String.format()中帶有字符串對齊功能如下
Java中使用Jedis操作Redis
移除 keys pre java max value con print 處的 轉載:http://www.cnblogs.com/liuling/p/2014-4-19-04.html 使用Java操作Redis需要jedis-2.1.0.jar,下載地址:http://
java中實現Comparable接口實現自定義排序
static -1 return rabl generated args logs ava sca 1 class Student implements Comparable{ 2 String name; 3 int gpa; 4 @Ov
java中的位操作
ble 其他 自動 byte 有符號 cnblogs 運算 編譯 位移操作 之前做項目的時候使用位操作不是很多,今天在刷leetcode上題目的時候用到了位操作,是leetcode中的第29題Divide Two Integers。 一、java的位操作: 位運算表達式由操
Java中Cookie常用操作類(Spring中操作Cookie)
方法 .net str blog .cn shm efault csdn int 說明:Cookie下用Key取值沒有快速的方法,只能便利循環去取。 import java.util.HashMap; import java.util.Map; import
Java中的IO操作 字符流:FileReader和 FileWriter
void contain desc method eno exceptio contains args http FileReader和 FileWriter 讀寫字符串 1 package object.io; 2 3 import java.io.Buff