电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Java多線程CAS操作原理代碼實(shí)例解析

瀏覽:11日期:2022-08-28 10:47:20

CAS操作號(hào)稱無鎖優(yōu)化,也叫作自旋;對(duì)于一些常見的操作需要加鎖,然后jdk就提供了一些以Atomic開頭的類,這些類內(nèi)部自動(dòng)帶了鎖,當(dāng)然這里的鎖并非是用synchronized來實(shí)現(xiàn)的,而是通過CAS操作來實(shí)現(xiàn)的;

一、下面是 AtomicInteger 的使用:

package com.designmodal.design.juc01;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;/** * @author D-L * @Classname T03_AtomicInteger * @Version 1.0 * @Description 使用 AtomicInteger 類解決常見的 多線程count++ *其內(nèi)部使用了CAS操作來保證原子性 但是不能保證多個(gè)方法連續(xù)調(diào)用都是原子性 * @Date 2020/7/21 0:35 */public class T03_AtomicInteger { //使用AtomicInteger類 AtomicInteger count = new AtomicInteger(0); public void m(){ for (int i = 0; i < 10000; i++) { //等同于 在 count++ 上加鎖 count.incrementAndGet(); } } public static void main(String[] args) { T03_AtomicInteger t = new T03_AtomicInteger(); List<Thread> threads = new ArrayList<>(); for (int i = 0; i < 10; i++) { threads.add(new Thread(t::m , 'Thread' + i)); } threads.forEach((o) -> o.start()); threads.forEach(o ->{ try {o.join(); } catch (InterruptedException e) {e.printStackTrace(); } }); System.out.println(t.count); }}

二、當(dāng)然達(dá)到使用的級(jí)別很簡單,看一下API就好了,通過上面的小程序,下面主要來聊一聊原理:

1、通過源碼分析AtomicInteger

首先小程序中定義了一個(gè) AtomicInteger 類型的變量count;

AtomicInteger count = new AtomicInteger(0); public void add(){ count.incrementAndGet(); }

調(diào)用了AtomicInteger類中incrementAndGet();

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

調(diào)用unsafe類中的 getAndAddInt(Object var1, long var2, int var4)方法;

public native int getIntVolatile(Object var1, long var2);public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5); 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; }

這里通過以上三步的操作,最終會(huì)進(jìn)入U(xiǎn)nsafe類這里調(diào)用的 compareAndSwapInt 意思就是比較然后交換,通過一個(gè)while循環(huán),在這里轉(zhuǎn)呀轉(zhuǎn),直到修改成功;

CAS(compareAndSwap)(比較并交換):原來想改變的值為0 ,現(xiàn)在想修改成1 ,這里想做到線程安全就必須要加synchronized,現(xiàn)在想用另外一種方式來替換加鎖的方法,就是所謂的CAS操作;你可以把它想象成擁有三個(gè)參數(shù)的方法cas(V , Expected , NewValue); 第一個(gè)參數(shù)V是你要改的那個(gè)值,Expected第二個(gè)參數(shù)是你期望當(dāng)前的值是多少(也就是如果沒有線程修改的時(shí),這個(gè)值應(yīng)該是多少,如果不是期望值那就證明有別的線程修改過),NewValue是要設(shè)置的新值;

Java多線程CAS操作原理代碼實(shí)例解析

上圖簡單模擬了CAS操作的過程,當(dāng)線程1和線程2同時(shí)讀取了共享變量count = 0;在線程1修改的過程中,線程2已經(jīng)將count值修改為1,那么在線程1修改的時(shí)候發(fā)現(xiàn)Expected值和V已經(jīng)匹配不上了,證明已經(jīng)有線程快我一步將count值改了(可能這里并發(fā)量大的時(shí)候已經(jīng)有n多個(gè)線程已經(jīng)修改過了),怎么辦呢?那我只能將我的期望值修改成V的值、newValue 在這基礎(chǔ)上加1,然后繼續(xù)在這自旋操作,直到修改成功,這就是自旋操作;

2、Unsafe類(java并發(fā)包底層實(shí)現(xiàn)的核心)

CAS操作不需要加鎖是如何做到的呢?原因就在于Unsafe這個(gè)類,這個(gè)類除了你使用反射之外,你是不能夠直接使用的,這里不能使用的原因和ClassLoader有關(guān)系,所有AtomicXXX 類內(nèi)部都是CompareAndSwap / CompareAndSet(新版jdk),這個(gè)類中存在好多native方法;

Unsafe類使Java擁有了像C語言的指針一樣操作內(nèi)存空間的能力,一旦能夠直接操作內(nèi)存,這也就意味著(1)不受JVM管理,也就意味著無法被GC,需要我們手動(dòng)GC,稍有不慎就會(huì)出現(xiàn)內(nèi)存泄漏。(2)Unsafe的不少方法中必須提供原始地址(內(nèi)存地址)和被替換對(duì)象的地址,偏移量要自己計(jì)算,一旦出現(xiàn)問題就是JVM崩潰級(jí)別的異常,會(huì)導(dǎo)致整個(gè)JVM實(shí)例崩潰,表現(xiàn)為應(yīng)用程序直接crash掉。(3)直接操作內(nèi)存,也意味著其速度更快,在高并發(fā)的條件之下能夠很好地提高效率。

CAS:CompareAndSwap,內(nèi)存偏移地址(var2),預(yù)期值(var4),新值(var5)。如果變量在當(dāng)前時(shí)刻的值和預(yù)期值expected相等,嘗試將變量的值更新為新值(var5)。如果更新成功,返回true;否則,返回false。

/** * CAS操作 :Unsafe類中的本地方法 由于Java語言無法訪問操作系統(tǒng)底層信息(比如:底層硬件設(shè)備等), * 這時(shí)候就需要借助C C++語言來完成了 * @param var1 對(duì)象 * @param var2 偏移量 * @param var4 期望值 * @param var5 新值 * @return 修改成功返回true 失敗返回false */ public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5); public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5); public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);

三、CAS操作帶來的ABA問題

ABA問題說白了就是在線程進(jìn)行CAS操作過程中有多個(gè)線程對(duì)這個(gè)共享變量進(jìn)行修改,有加有減,兜兜轉(zhuǎn)轉(zhuǎn)又回到起始值,這時(shí)該線程渾然不知;打個(gè)不恰當(dāng)?shù)谋扔鳎哼@個(gè)過程就好像你前女友跟你分手以后,在時(shí)隔一年之后又找你復(fù)合來了,說兜兜轉(zhuǎn)轉(zhuǎn)還是覺得你好,在此期間你前女友已經(jīng)換了幾個(gè)男朋友你卻渾然不知,那個(gè)好看的她穿著你喜歡的小短裙,扎著清純的馬尾辮又回來,好了言歸正傳,意思就是結(jié)果是你期望的,可是這個(gè)值是經(jīng)過很多版本的。

下面簡單模擬ABA操作圖:

Java多線程CAS操作原理代碼實(shí)例解析

如何解決ABA問題呢?

如果是int類型,最終的值也是你期望的,真的是沒有所謂,你也不用去糾結(jié)這問題;如果你確實(shí)就想管一管,那就加一個(gè)版本號(hào),做一次修改操作加一,比較檢查時(shí)連帶版本號(hào)一起檢查。

基礎(chǔ)類型:沒有必要管,對(duì)你真的沒有所謂;

引用類型:就像是你女朋友和你分手之后又復(fù)合,中間經(jīng)歷了多少個(gè)男朋友,這個(gè)是有所謂的,這時(shí)可以通過加版本號(hào)來解決;

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 壹作文_中小学生优秀满分作文大全 | 中山东港家具集团-酒店-办公-医养家具定制厂家 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 小型数控车床-数控车床厂家-双头数控车床 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 户外-组合-幼儿园-不锈钢-儿童-滑滑梯-床-玩具-淘气堡-厂家-价格 | 英语词典_成语词典_日语词典_法语词典_在线词典网 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 工业雾炮机_超细雾炮_远程抑尘射雾器-世纪润德环保设备 | 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 压滤机滤板_厢式_隔膜_板框压滤机滤板厂家价格型号材质-大凯环保 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 洗地机-全自动/手推式洗地机-扫地车厂家_扬子清洁设备 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 会议会展活动拍摄_年会庆典演出跟拍_摄影摄像直播-艾木传媒 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 |