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

您的位置:首頁技術文章
文章詳情頁

Java CAS基本實現原理代碼實例解析

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

一、前言

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

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

Java CAS基本實現原理代碼實例解析

二、實例

如果我們需要對一個數進行加法操作,應該怎樣去實現呢?我們模擬多個線程情況下進行操作。

ThreadDemo.java 實現一個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 創建線程池,提交10個線程執行,預期結果應該是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());}}

運行結果:874 或其他,與預期結果不符合。

執行出來的結果并不是想象中的結果。這是為什么呢?這跟線程的執行過程有關。

Java CAS基本實現原理代碼實例解析

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

此時可以用volatile關鍵字。它的作用是保證對象在內存中的可見性。

修改ThreadDemo中的count字段

private volatile int count = 0;

此時執行結果:900 或其他,與預期結果不符合。

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

線程安全主要體現在三個方面:

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

目前可見性已經實現了,缺少原子性的操作,因為同一時刻,多個線程對其操作,會將改動后的最新值讀取到自己的工作內存進行操作,最終只能得到后一個執行線程操作的結果,所以相當于少了一步操作,就會造成數據的不一致。

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

Java CAS基本實現原理代碼實例解析

Atomic類是使用CAS+volatile來實現原子性與可見性的。

我們來改造一下TheadDemo.java中的實現方法

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();}}

執行結果: 1000,符合預期值。

Java CAS基本實現原理代碼實例解析

接下來我們來分析一下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在內存中的偏移量,利用靜態代碼塊使其類一加載的時候就賦值。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表示當前對象,var2表示value在內存中的偏移量,var4為增加的值。var5為調用底層方法獲取value的值

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

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

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;}}

運行結果: 1000,符合預期值。

444

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

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品视频3p| 久久精品国产成人一区二区三区| 日韩精品水蜜桃| 日韩午夜av| 日韩精彩视频在线观看| 国产精品一区二区中文字幕| 国产不卡精品| 欧美在线资源| 欧美永久精品| 福利在线一区| 日韩午夜高潮| 日韩不卡在线观看日韩不卡视频| 国产探花在线精品一区二区| 色婷婷亚洲mv天堂mv在影片| 日韩午夜在线| 国产精品九九| 久久久五月天| 日韩激情视频网站| 波多视频一区| 日韩欧美2区| 性欧美videohd高精| 午夜a一级毛片亚洲欧洲| 久久这里只有精品一区二区| 欧美日韩视频| 国产一区精品福利| 三级欧美韩日大片在线看| 欧美a级一区二区| 99在线观看免费视频精品观看| 欧美欧美黄在线二区| 久久精品免费一区二区三区 | 国产精品毛片一区二区三区| 91免费精品国偷自产在线在线| 久久男人天堂| 日韩精品一区二区三区免费视频| 亚洲天堂1区| 国产亚洲久久| 国产99亚洲| 国产伦理一区| 欧美另类专区| 成人在线黄色| 精品伊人久久久| 国产亚洲观看| 99视频精品全国免费| 亚洲精品成a人ⅴ香蕉片| 美腿丝袜在线亚洲一区| 久久久久.com| 日韩影片在线观看| 伊人久久视频| 亚洲精品影视| 日韩欧美一区二区三区免费看| 国产精品日韩| 欧美黑人做爰爽爽爽| 女人av一区| 亚洲精品裸体| 日韩欧美自拍| 青青草精品视频| 在线日韩电影| 美女视频黄久久| 欧美日韩视频一区二区三区| 国产欧美日韩一区二区三区四区| 91精品精品| 国产精品日韩精品在线播放 | 激情婷婷综合| 国产精品一区二区三区av麻| 欧美日韩国产一区精品一区| 欧美国产日韩电影| 99精品电影| 免费在线亚洲欧美| 免费久久99精品国产| 91嫩草亚洲精品| 午夜亚洲福利| 欧美日韩黑人| 成人国产精品久久| 日本午夜精品久久久| 图片区亚洲欧美小说区| 欧美激情一区| 亚洲一区二区小说| 亚洲性视频h| 成人一二三区| 国产精品中文字幕制服诱惑| 日韩影院免费视频| 日韩精品一卡| 精品一区电影| 日韩**一区毛片| aa国产精品| 韩国精品主播一区二区在线观看| 美女性感视频久久| 少妇精品在线| 国产一区白浆| 欧美一区二区三区激情视频| 久久精品九色| 国产欧美日韩免费观看| 中文字幕日韩亚洲| 蜜臀av免费一区二区三区| 国产videos久久| 91精品丝袜国产高跟在线| 亚洲爱爱视频| 日韩电影免费网站| 国产一区二区三区天码| 国产日韩欧美一区二区三区在线观看 | 亚洲精品黄色| 一区久久精品| 91成人精品视频| 久久九九99| 亲子伦视频一区二区三区| 精品72久久久久中文字幕| 国产剧情一区二区在线观看| 91精品国产一区二区在线观看| 六月丁香综合| 欧美性感美女一区二区 | 私拍精品福利视频在线一区| 精品视频97| 国产福利一区二区精品秒拍 | 欧美日本三区| 91精品国产自产在线丝袜啪| 四虎在线精品| 亚洲精品黄色| 日韩中文字幕av电影| 亚洲免费一区二区| 日韩视频一区| 日韩中文字幕av电影| 中文一区一区三区免费在线观 | 亚洲欧美网站| 91九色精品| 亚洲午夜在线| 免费视频国产一区| 悠悠资源网久久精品| 欧美日韩国产一区二区三区不卡 | 国产精品一区二区精品| 国产欧美自拍| 久久精品毛片| 天堂av在线| 国产欧洲在线| 日韩免费高清| japanese国产精品| 亚洲精品2区| 视频一区二区中文字幕| 亚洲v天堂v手机在线| 日本视频一区二区| 欧美国产先锋| 亚洲黄色免费看| 欧美福利专区| 蜜桃久久av| 日本不卡高清| 麻豆精品视频在线观看免费| 成人在线视频区| 99热精品久久| 中文字幕一区二区三区日韩精品 | 国产精品女主播一区二区三区| 在线精品福利| 国产精品99久久免费| 欧美三级网址| 日韩一区二区久久| 日韩成人一级| av中文资源在线资源免费观看| 久久激情中文| 免费精品视频最新在线| 国产精品v一区二区三区| 9999国产精品| 免费在线观看成人| 久久精品国产网站| 亚洲深夜福利在线观看| 免费看久久久| 丝袜脚交一区二区| 精品视频99| 日韩一区精品| 人人精品亚洲| 国产伦精品一区二区三区千人斩| 欧美日韩免费观看一区=区三区| 国产精品亚洲一区二区在线观看| 99精品一区| 欧美精品1区| 亚洲三级网站| 久久一区二区中文字幕| 国产精品一区二区三区美女 | 久久超碰99| 丝袜亚洲另类欧美| av在线最新| 国产精久久一区二区| 蜜臀精品一区二区三区在线观看| 成人国产精品一区二区网站| 四虎精品永久免费| 亚洲成人日韩| 高潮一区二区| 国产乱码精品一区二区三区亚洲人| 99亚洲视频| 日韩高清欧美| 欧美激情福利| 亚洲精品自拍| 久久亚洲色图| 久久国产中文字幕| 精品成人18| 久久国产精品免费一区二区三区| 国产亚洲永久域名| 欧美/亚洲一区| 欧洲一区二区三区精品| 国产欧美午夜| 日本aⅴ亚洲精品中文乱码| 免费中文字幕日韩欧美| 久久久精品日韩|