摘要:當(dāng)前可用的原子數(shù)組有和,分別表示整數(shù)數(shù)組型數(shù)組和普通的對(duì)象數(shù)組。摘自實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)一書(shū)實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)中的指針類(lèi)實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)無(wú)鎖的對(duì)象引用實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)帶有時(shí)間戳的對(duì)象引用
除了提供基本數(shù)據(jù)類(lèi)型外,JDK還為我們準(zhǔn)備了數(shù)組等復(fù)合結(jié)構(gòu)。當(dāng)前可用的原子數(shù)組有:AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray,分別表示整數(shù)數(shù)組、long型數(shù)組和普通的對(duì)象數(shù)組。
這里以AtomicIntegerArray為例,展示原子數(shù)組的使用方式。
AtomicIntegerArray本質(zhì)上是對(duì)int[]類(lèi)型的封裝。使用Unsafe類(lèi)通過(guò)CAS的方式控制int[]在多線(xiàn)程下的安全性。它提供了以下幾個(gè)核心API:
//獲得數(shù)組第i個(gè)下標(biāo)的元素 public final int get(int i) //獲得數(shù)組的長(zhǎng)度 public final int length() //將數(shù)組第i個(gè)下標(biāo)設(shè)置為newValue,并返回舊的值 public final int getAndSet(int i, int newValue) //進(jìn)行CAS操作,如果第i個(gè)下標(biāo)的元素等于expect,則設(shè)置為update,設(shè)置成功返回true public final boolean compareAndSet(int i, int expect, int update) //將第i個(gè)下標(biāo)的元素加1 public final int getAndIncrement(int i) //將第i個(gè)下標(biāo)的元素減1 public final int getAndDecrement(int i) //將第i個(gè)下標(biāo)的元素增加delta(delta可以是負(fù)數(shù)) public final int getAndAdd(int i, int delta)
下面給出一個(gè)簡(jiǎn)單的示例,展示AtomicIntegerArray使用:
01 public class AtomicIntegerArrayDemo { 02 static AtomicIntegerArray arr = new AtomicIntegerArray(10); 03 public static class AddThread implements Runnable{ 04 public void run(){ 05 for(int k=0;k<10000;k++) 06 arr.getAndIncrement(k%arr.length()); 07 } 08 } 09 public static void main(String[] args) throws InterruptedException { 10 Thread[] ts=new Thread[10]; 11 for(int k=0;k<10;k++){ 12 ts[k]=new Thread(new AddThread()); 13 } 14 for(int k=0;k<10;k++){ts[k].start();} 15 for(int k=0;k<10;k++){ts[k].join();} 16 System.out.println(arr); 17 } 18 }
上述代碼第2行,申明了一個(gè)內(nèi)含10個(gè)元素的數(shù)組。第3行定義的線(xiàn)程對(duì)數(shù)組內(nèi)10個(gè)元素進(jìn)行累加操作,每個(gè)元素各加1000次。第11行,開(kāi)啟10個(gè)這樣的線(xiàn)程。因此,可以預(yù)測(cè),如果線(xiàn)程安全,數(shù)組內(nèi)10個(gè)元素的值必然都是10000。反之,如果線(xiàn)程不安全,則部分或者全部數(shù)值會(huì)小于10000。
程序的輸出結(jié)果如下:
[10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000]
這說(shuō)明AtomicIntegerArray確實(shí)合理地保證了數(shù)組的線(xiàn)程安全性。
摘自《實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)》一書(shū)
【實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)1】Java中的指針:Unsafe類(lèi)
【實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)2】無(wú)鎖的對(duì)象引用:AtomicReference
【實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì) 3】帶有時(shí)間戳的對(duì)象引用:AtomicStampedReference
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65569.html
摘要:在本例中,講述的無(wú)鎖來(lái)自于并發(fā)包我們將這個(gè)無(wú)鎖的稱(chēng)為。在這里,我們使用二維數(shù)組來(lái)表示的內(nèi)部存儲(chǔ),如下變量存放所有的內(nèi)部元素。為什么使用二維數(shù)組去實(shí)現(xiàn)一個(gè)一維的呢這是為了將來(lái)進(jìn)行動(dòng)態(tài)擴(kuò)展時(shí)可以更加方便。 我們已經(jīng)比較完整得介紹了有關(guān)無(wú)鎖的概念和使用方法。相對(duì)于有鎖的方法,使用無(wú)鎖的方式編程更加考驗(yàn)一個(gè)程序員的耐心和智力。但是,無(wú)鎖帶來(lái)的好處也是顯而易見(jiàn)的,第一,在高并發(fā)的情況下,它比有鎖...
摘要:有時(shí)候,由于初期考慮不周,或者后期的需求變化,一些普通變量可能也會(huì)有線(xiàn)程安全的需求。它可以讓你在不改動(dòng)或者極少改動(dòng)原有代碼的基礎(chǔ)上,讓普通的變量也享受操作帶來(lái)的線(xiàn)程安全性,這樣你可以修改極少的代碼,來(lái)獲得線(xiàn)程安全的保證。 有時(shí)候,由于初期考慮不周,或者后期的需求變化,一些普通變量可能也會(huì)有線(xiàn)程安全的需求。如果改動(dòng)不大,我們可以簡(jiǎn)單地修改程序中每一個(gè)使用或者讀取這個(gè)變量的地方。但顯然,這...
摘要:并發(fā)包將這種無(wú)鎖方案封裝提煉之后,實(shí)現(xiàn)了一系列的原子類(lèi)。無(wú)鎖方案相對(duì)互斥鎖方案,最大的好處就是性能。作為一條指令,指令本身是能夠保證原子性的。 前面我們多次提到一個(gè)累加器的例子,示例代碼如下。在這個(gè)例子中,add10K() 這個(gè)方法不是線(xiàn)程安全的,問(wèn)題就出在變量 count 的可見(jiàn)性和 count+=1 的原子性上。可見(jiàn)性問(wèn)題可以用 volatile 來(lái)解決,而原子性問(wèn)題我們前面一直都...
摘要:實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)連載中的指針類(lèi)和非常類(lèi)似,不同之處就在于是對(duì)整數(shù)的封裝,而則對(duì)應(yīng)普通的對(duì)象引用。這樣,當(dāng)前線(xiàn)程就無(wú)法正確判斷這個(gè)對(duì)象究竟是否被修改過(guò)。摘自實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)一書(shū) 【實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)】連載1–Java中的指針:Unsafe類(lèi) AtomicReference和AtomicInteger非常類(lèi)似,不同之處就在于AtomicInteger是對(duì)整數(shù)的封裝,而Atomi...
摘要:介紹中無(wú)鎖的線(xiàn)程安全整數(shù),一個(gè)提供原子操作的的類(lèi)。在語(yǔ)言中,和操作并不是線(xiàn)程安全的,在使用的時(shí)候,不可避免的會(huì)用到關(guān)鍵字。而則通過(guò)一種線(xiàn)程安全的加減操作接口。就是的意思,比較并操作。有個(gè)操作數(shù),內(nèi)存值,舊的預(yù)期值,要修改的新值。 【介紹 JAVA 中無(wú)鎖的線(xiàn)程安全整數(shù) AtomicInteger,一個(gè)提供原子操作的Integer的類(lèi)。在Java語(yǔ)言中,++i和i++操作并不是線(xiàn)程安全的...
閱讀 2541·2021-10-09 09:44
閱讀 644·2019-08-30 15:44
閱讀 3004·2019-08-29 18:46
閱讀 1139·2019-08-29 18:38
閱讀 563·2019-08-26 10:44
閱讀 2436·2019-08-23 16:07
閱讀 1098·2019-08-23 15:38
閱讀 4104·2019-08-23 14:02