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

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

Java AtomicInteger類使用方法實(shí)例講解

瀏覽:105日期:2022-08-30 18:52:03

1、java.util.concurrent.atomic 的包里有AtomicBoolean, AtomicInteger,AtomicLong,AtomicLongArray,AtomicReference等原子類的類,主要用于在高并發(fā)環(huán)境下的高效程序處理,來(lái)幫助我們簡(jiǎn)化同步處理.

在Java語(yǔ)言中,++i和i++操作并不是線程安全的,在使用的時(shí)候,不可避免的會(huì)用到synchronized關(guān)鍵字。而AtomicInteger則通過一種線程安全的加減操作接口。

2、AtomicInteger的基本方法

創(chuàng)建一個(gè)AtomicInteger

System.out.println(atomicInteger.get());

--->輸出 : 123

創(chuàng)建一個(gè)不傳值的,默認(rèn)值為0

AtomicInteger atomicInteger = new AtomicInteger();System.out.println(atomicInteger.get());---->輸出: 0

獲取和賦值

atomicInteger.get(); //獲取當(dāng)前值atomicInteger.set(999); //設(shè)置當(dāng)前值

atomicInteger.compareAndSet(expectedValue,newValue)

public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(0); System.out.println(atomicInteger.get()); int expectedValue = 123; int newValue = 234; Boolean b =atomicInteger.compareAndSet(expectedValue, newValue); System.out.println(b); System.out.println(atomicInteger); }----》輸出結(jié)果為: 0 false 0 public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(123); System.out.println(atomicInteger.get()); int expectedValue = 123; int newValue = 234; Boolean b =atomicInteger.compareAndSet(expectedValue, newValue); System.out.println(b); System.out.println(atomicInteger); }-----》輸出結(jié)果為: 123 true 234

由上可知該方法表示,atomicInteger的值與expectedValue相比較,如果不相等,則返回false,atomicInteger原有值保持不變;如果兩者相等,則返回true,atomicInteger的值更新為newValue

getAndAdd()方法與AddAndGet方法

AtomicInteger atomicInteger = new AtomicInteger(123); System.out.println(atomicInteger.get()); --123 System.out.println(atomicInteger.getAndAdd(10)); --123 獲取當(dāng)前值,并加10 System.out.println(atomicInteger.get()); --133 System.out.println(atomicInteger.addAndGet(10)); --143 獲取加10后的值,先加10 System.out.println(atomicInteger.get()); --143

getAndDecrement()和DecrementAndGet()方法

AtomicInteger atomicInteger = new AtomicInteger(123); System.out.println(atomicInteger.get()); --123 System.out.println(atomicInteger.getAndDecrement()); --123 獲取當(dāng)前值并自減 System.out.println(atomicInteger.get()); --122 System.out.println(atomicInteger.decrementAndGet()); --121 先自減再獲取減1后的值 System.out.println(atomicInteger.get()); --121

3、使用AtomicInteger,即使不用同步塊synchronized,最后的結(jié)果也是100,可用看出AtomicInteger的作用,用原子方式更新的int值。主要用于在高并發(fā)環(huán)境下的高效程序處理。使用非阻塞算法來(lái)實(shí)現(xiàn)并發(fā)控制。

public class Counter { public static AtomicInteger count = new AtomicInteger(0); public static void inc(){ try{ Thread.sleep(1); //延遲1毫秒 }catch (InterruptedException e){ //catch住中斷異常,防止程序中斷 e.printStackTrace(); } count.getAndIncrement();//count值自加1 } public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(100); for(int i=0;i<100;i++){ new Thread(new Runnable() {@Overridepublic void run() { Counter.inc(); latch.countDown();} }).start(); } latch.await(); System.out.println('運(yùn)行結(jié)果:'+Counter.count); }}

運(yùn)行結(jié)果: 100

4、使用普通Integer

public class Counter { public volatile static int count = 0; public static void inc(){ try{ Thread.sleep(1); //延遲1毫秒 }catch (InterruptedException e){ //catch住中斷異常,防止程序中斷 e.printStackTrace(); } count++;//count值自加1 } public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(100); for(int i=0;i<100;i++){ new Thread(new Runnable() {@Overridepublic void run() { Counter.inc(); latch.countDown();} }).start(); } latch.await(); System.out.println('運(yùn)行結(jié)果:'+Counter.count); }}運(yùn)行結(jié)果:98

5、如果在inc方法前面加個(gè)synchronized也能是線程安全的;

它用來(lái)修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。

import java.util.concurrent.CountDownLatch;/** * created by guanguan on 2017/10/23 **/public class Counter { public volatile static Integer count = 0; public synchronized static void inc(){ try{ Thread.sleep(1); //延遲1毫秒 }catch (InterruptedException e){ //catch住中斷異常,防止程序中斷 e.printStackTrace(); } count++;//count值自加1 } public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(100); for(int i=0;i<100;i++){ new Thread(new Runnable() {@Overridepublic void run() { Counter.inc(); latch.countDown();} }).start(); } latch.await(); System.out.println('運(yùn)行結(jié)果:'+Counter.count); }}運(yùn)行結(jié)果:100

synchronized的使用說(shuō)明:

一、當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。

二、然而,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。

三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。

四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說(shuō),當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問都被暫時(shí)阻塞。

五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用.

6、從上面的例子中我們可以看出:使用AtomicInteger是非常的安全的.而且因?yàn)锳tomicInteger由硬件提供原子操作指令實(shí)現(xiàn)的。在非激烈競(jìng)爭(zhēng)的情況下,開銷更小,速度更快。

java的關(guān)鍵域有3個(gè)

// setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; private volatile int value;

這里, unsafe是java提供的獲得對(duì)對(duì)象內(nèi)存地址訪問的類,注釋已經(jīng)清楚的寫出了,它的作用就是在更新操作時(shí)提供“比較并替換”的作用。實(shí)際上就是AtomicInteger中的一個(gè)工具。

valueOffset是用來(lái)記錄value本身在內(nèi)存的便宜地址的,這個(gè)記錄,也主要是為了在更新操作在內(nèi)存中找到value的位置,方便比較。

注意:value是用來(lái)存儲(chǔ)整數(shù)的時(shí)間變量,這里被聲明為volatile,就是為了保證在更新操作時(shí),當(dāng)前線程可以拿到value最新的值(并發(fā)環(huán)境下,value可能已經(jīng)被其他線程更新了)。

這里,我們以自增的代碼為例,可以看到這個(gè)并發(fā)控制的核心算法:

源碼

public final int updateAndGet(IntUnaryOperator updateFunction) { int prev, next; do { prev = get(); next = updateFunction.applyAsInt(prev); } while (!compareAndSet(prev, next)); return next; }

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 二次元影像仪|二次元测量仪|拉力机|全自动影像测量仪厂家_苏州牧象仪器 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | BHK汞灯-百科|上海熙浩实业有限公司| 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 炉门刀边腹板,焦化设备配件,焦化焦炉设备_沧州瑞创机械制造有限公司 | 优宝-汽车润滑脂-轴承润滑脂-高温齿轮润滑油脂厂家 | 光照全温振荡器(智能型)-恒隆仪器| 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 北京办公室装修,办公室设计,写字楼装修-北京金视觉装饰工程公司 北京成考网-北京成人高考网 | 聚合氯化铝厂家-聚合氯化铝铁价格-河南洁康环保科技 | 河南mpp电力管_mpp电力管生产厂家_mpp电力电缆保护管价格 - 河南晨翀实业 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | VOC检测仪-甲醛检测仪-气体报警器-气体检测仪厂家-深恒安科技有限公司 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 西安中国国际旅行社(西安国旅) | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 |