日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java CAS基本實現(xiàn)原理代碼實例解析

瀏覽:118日期:2022-08-27 17:04:49

一、前言

了解CAS,首先要清楚JUC,那么什么是JUC呢?JUC就是java.util.concurrent包的簡稱。它有核心就是CAS與AQS。CAS是java.util.concurrent.atomic包的基礎(chǔ),如AtomicInteger、AtomicBoolean、AtomicLong等等類都是基于CAS。

什么是CAS呢?全稱Compare And Swap,比較并交換。CAS有三個操作數(shù),內(nèi)存值V,舊的預(yù)期值E,要修改的新值N。當(dāng)且僅當(dāng)預(yù)期值E和內(nèi)存值V相同時,將內(nèi)存值V修改為N,否則什么都不做。

Java CAS基本實現(xiàn)原理代碼實例解析

二、實例

如果我們需要對一個數(shù)進行加法操作,應(yīng)該怎樣去實現(xiàn)呢?我們模擬多個線程情況下進行操作。

ThreadDemo.java 實現(xiàn)一個Runnable接口

package com.spring.security.test;public class ThreadDemo implements Runnable {private int count = 0;@Overridepublic void run() {for (int i = 0; i < 100; i++) {addCount();}}private void addCount() {count++;}public int getCount() {return count;}}

ThreadTest.java 創(chuàng)建線程池,提交10個線程執(zhí)行,預(yù)期結(jié)果應(yīng)該是1000

package com.spring.security.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadTest {public static void main(String[] args) {ExecutorService threadPool = Executors.newFixedThreadPool(10);ThreadDemo threadDemo = new ThreadDemo();for (int i = 0; i < 10; i++) {threadPool.submit(threadDemo);} threadPool.shutdown();System.out.println(threadDemo.getCount());}}

運行結(jié)果:874 或其他,與預(yù)期結(jié)果不符合。

執(zhí)行出來的結(jié)果并不是想象中的結(jié)果。這是為什么呢?這跟線程的執(zhí)行過程有關(guān)。

Java CAS基本實現(xiàn)原理代碼實例解析

所以我們需要在改變count,將值從高速緩沖區(qū)刷新到主內(nèi)存后,讓其他線程重新讀取主內(nèi)存中的值到自己的工作內(nèi)存。

此時可以用volatile關(guān)鍵字。它的作用是保證對象在內(nèi)存中的可見性。

修改ThreadDemo中的count字段

private volatile int count = 0;

此時執(zhí)行結(jié)果:900 或其他,與預(yù)期結(jié)果不符合。

此時還是并未得出正確執(zhí)行結(jié)果。為什么?聽我細細道來。

線程安全主要體現(xiàn)在三個方面:

原子性:提供了互斥訪問,同一時刻只能有一個線程對它進行操作 可見性:一個線程對主內(nèi)存的修改可以及時的被其他線程觀察到 有序性:一個線程觀察其他線程中的指令執(zhí)行順序,由于指令重排序的存在,該觀察結(jié)果一般雜亂無序

目前可見性已經(jīng)實現(xiàn)了,缺少原子性的操作,因為同一時刻,多個線程對其操作,會將改動后的最新值讀取到自己的工作內(nèi)存進行操作,最終只能得到后一個執(zhí)行線程操作的結(jié)果,所以相當(dāng)于少了一步操作,就會造成數(shù)據(jù)的不一致。

此時可以使用JUC的Atomic包下面的類來進行操作。

Java CAS基本實現(xiàn)原理代碼實例解析

Atomic類是使用CAS+volatile來實現(xiàn)原子性與可見性的。

我們來改造一下TheadDemo.java中的實現(xiàn)方法

package com.spring.security.test;import java.util.concurrent.atomic.AtomicInteger;public class ThreadDemo implements Runnable {private AtomicInteger count = new AtomicInteger(0);@Overridepublic void run() {for (int i = 0; i < 100; i++) {// 遞增count.getAndIncrement();}}public int getCount() {return count.get();}}

執(zhí)行結(jié)果: 1000,符合預(yù)期值。

Java CAS基本實現(xiàn)原理代碼實例解析

接下來我們來分析一下AtomicInteger類的源碼:

private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;static { try { valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField('value')); } catch (Exception ex) { throw new Error(ex); }}private volatile int value;

Unsafe類是不安全的類,它提供了一些底層的方法,我們是不能使用這個類的。AtomicInteger的值保存在value中,而valueOffset是value在內(nèi)存中的偏移量,利用靜態(tài)代碼塊使其類一加載的時候就賦值。value值使用volatile,保證其可見性。

/** * Atomically increments by one the current value. * * @return the previous value */ public final int getAndIncrement() { return unsafe.getAndAddInt(this, valueOffset, 1); }

public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}

var1表示當(dāng)前對象,var2表示value在內(nèi)存中的偏移量,var4為增加的值。var5為調(diào)用底層方法獲取value的值

compareAndSwapInt方法通過var1和var2獲取當(dāng)前內(nèi)存中的value值,并與var5進行比對,如果一致,就將var5+var4的值賦給value,并返回true,否則返回false

由do while語句可知,如果這次沒有設(shè)置進去值,就重復(fù)執(zhí)行此過程。這一過程稱為自旋。

compareAndSwapInt是JNI(Java Native Interface)提供的方法,可以是其他語言寫的。

三、與synchronized比較

使用synchronized進行加法:

package com.spring.security.test;public class ThreadDemo implements Runnable {private int count = 0;@Overridepublic void run() {for (int i = 0; i < 100; i++) {// 遞增synchronized (ThreadDemo.class) {count++;}}}public int getCount() {return count;}}

運行結(jié)果: 1000,符合預(yù)期值。

444

使用synchronized和AtomicInteger都能得到預(yù)期結(jié)果,但是他們之間各有什么劣勢呢?

synchronized是重量級鎖,是悲觀鎖,就是無論你線程之間發(fā)不發(fā)生競爭關(guān)系,它都認為會發(fā)生競爭,從而每次執(zhí)行都會加鎖。

在并發(fā)量大的情況下,如果鎖的時間較長,那將會嚴重影響系統(tǒng)性能。

CAS操作中我們可以看到getAndAddInt方法的自旋操作,如果長時間自旋,那么肯定會對系統(tǒng)造成壓力。而且如果value值從A->B->A,那么CAS就會認為這個值沒有被操作過,這個稱為CAS操作的'ABA'問題。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产黄a∨片高清在线| 午夜久久免费观看| 免费一区二区视频| 亚洲免费中文| 亚洲天堂免费| 日本不卡高清视频| 欧美日韩18| 久久久亚洲欧洲日产| 久久亚洲道色| 中文字幕在线高清| 超碰在线99| 91精品国产乱码久久久久久久| 欧美日韩在线二区| 欧美日韩国产综合网| 午夜在线精品偷拍| 日韩手机在线| 久久精品一区| 丝袜av一区| 好看的亚洲午夜视频在线| 免费人成黄页网站在线一区二区| 综合激情网...| 国产女人18毛片水真多18精品| 国产精品国产三级在线观看| 日本一二区不卡| 狠狠操综合网| 日韩中文字幕一区二区三区| 日本成人一区二区| 精品国产一区二区三区噜噜噜| 蜜桃精品在线| 蜜桃一区二区三区在线| 久久精品 人人爱| www.51av欧美视频| 99视频精品免费观看| 日韩久久99| 国产一区二区三区四区二区| 999久久久91| 视频国产精品| 国产一区二区三区不卡视频网站| 亚洲网站视频| 日韩欧美精品一区二区综合视频| 国产精品最新| 亚洲91精品| 日本欧美久久久久免费播放网| 丰满少妇一区| 亚洲欧美日韩国产综合精品二区| 国产伦理久久久久久妇女| 日韩欧美另类一区二区| 亚洲综合中文| 黄色在线观看www| 中文在线日韩| 日韩电影免费网站| 亚洲精品伊人| 黄色aa久久| 午夜性色一区二区三区免费视频| 国产一二在线播放| 日韩精品一二三四| 国产成人久久精品麻豆二区| 日本 国产 欧美色综合| 国产一区二区三区四区五区| 亚洲一区欧美激情| 欧美日韩伊人| 午夜久久一区| 老司机精品在线| 亚洲视频播放| 国产成人免费av一区二区午夜| 麻豆9191精品国产| 福利一区和二区| 亚洲免费成人av在线| 日韩在线短视频| 日本久久一区| 婷婷激情图片久久| 欧美国产精品| 视频一区二区三区在线| 国产精选在线| 日韩高清电影一区| 亚洲女同一区| 国产一区二区三区精品在线观看| 男女男精品网站| 99久久婷婷| 激情久久一区二区| 日韩超碰人人爽人人做人人添| 亚洲成人日韩| 日韩欧美二区| 免费日韩一区二区三区| 婷婷综合成人| 欧美~级网站不卡| 久久精品亚洲一区二区| 日本欧美在线| 亚洲一区二区三区久久久| 久久精品一区二区不卡| 精品国产麻豆| 久久99性xxx老妇胖精品| 亚洲欧洲美洲国产香蕉| 亚洲精品97| 久久九九国产| 国产精品精品| 久久中文在线| 国产精品一线天粉嫩av| 亚洲精品国产日韩| 免费美女久久99| 国户精品久久久久久久久久久不卡| 久久免费精品| 国产精品地址| 国产精品最新| 欧美一区不卡| 91亚洲无吗| 91麻豆精品激情在线观看最新| 日韩视频免费| 在线一区免费| 蜜桃国内精品久久久久软件9| 亚洲综合在线电影| 正在播放日韩精品| 国产一区二区视频在线看| 国产精品入口久久| 国产欧美日韩在线观看视频| 蜜臀精品久久久久久蜜臀| 91精品成人| 日韩天堂av| 亚洲精品一区二区在线看| 久久精品高清| 欧美精品一区二区三区精品| 美女网站一区| 中文精品视频| 喷白浆一区二区| 亚洲人成亚洲精品| 四虎精品一区二区免费| 日韩精品中文字幕吗一区二区| 香蕉久久久久久| 欧美一区成人| 久久影视三级福利片| 老牛国内精品亚洲成av人片| 欧美国产免费| 麻豆视频在线观看免费网站黄 | 国产一区日韩一区| 久久久国产精品一区二区中文| 日韩精品2区| 日韩综合精品| 亚洲大全视频| 免费美女久久99| 日韩一区二区三区在线看| 欧美精品福利| 福利视频一区| 亚洲一级网站| 在线一区二区三区视频| 亚洲欧美网站在线观看| 久久精品av麻豆的观看方式| 国产精品探花在线观看| 国内自拍视频一区二区三区| 国产高清不卡| 精品欧美激情在线观看| 视频一区二区三区入口| 欧美另类中文字幕| 四虎8848精品成人免费网站| 亚洲二区在线| 亚洲精品伦理| 精品视频免费| 91成人精品| 日本不卡视频在线| 另类欧美日韩国产在线| 日韩啪啪电影网| 日韩一区二区免费看| 日本亚洲最大的色成网站www| 国产精品theporn| 欧美国产偷国产精品三区| 蜜臀91精品国产高清在线观看| 蜜臀va亚洲va欧美va天堂| 国产精品www.| av高清一区| 中文字幕日本一区二区| 欧美激情麻豆| 亚洲二区免费| 国产亚洲观看| 久久网站免费观看| 亚洲精品在线二区| 久久精品国产福利| 欧美 日韩 国产精品免费观看| 亚洲精品免费观看| 国产中文欧美日韩在线| 国产色综合网| 国精品产品一区| 亚洲伊人精品酒店| 精品九九久久| 亚洲免费福利一区| 欧美aa在线观看| 欧美一区成人| 婷婷亚洲五月| 美女精品视频在线| 奶水喷射视频一区| 精品中文字幕一区二区三区| 欧美日韩国产一区精品一区| 国产精品xvideos88| 国产精品婷婷| 国产成人黄色| 日韩欧美中文字幕在线视频| 特黄毛片在线观看| 91亚洲精品视频在线观看 | 欧美黄色一区| 蜜桃视频在线观看一区| 日韩a一区二区| 欧美午夜三级|