線(xiàn)程學(xué)習(xí)記錄05-原子類(lèi)型

有如下代碼:

public class VolatitleNoAtomic extends Thread {

private static volatile int count = 0 ;

private void addCount(){
    for (int i = 0; i < 1000; i++){
        count ++ ;
    }
    System.out.println(count);
}

@Override
public void run() {
    addCount();
}

public static void main(String[] args) {
    VolatitleNoAtomic[] arr = new VolatitleNoAtomic[10];
    for (int i = 0 ; i < 10 ; i++){
        arr[i] = new VolatitleNoAtomic();
    }
    for (int i = 0 ; i < 10 ; i++){
        arr[i].start();
    }
}
}

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

image.png

這里count已然加上了volatitle關(guān)鍵字修飾,但是產(chǎn)生的數(shù)據(jù)依舊是線(xiàn)程不安全的。這里說(shuō)明volatile只是具有可見(jiàn)性,但是本身不具備原子性。在不使用synchronized同步機(jī)制或其他同步機(jī)制的情況下,可以使用原子數(shù)據(jù)類(lèi)型本身可以有一個(gè)比較輕量的方式。要實(shí)現(xiàn)原子性,建議使用Atomic系列的類(lèi)

修改后的代碼:

public class VolatitleNoAtomic extends Thread {

//    private static volatile int count = 0 ;
  private static AtomicInteger count = new AtomicInteger(0) ;

private void addCount(){
    for (int i = 0; i < 1000; i++){
        count.incrementAndGet();
    }

    System.out.println(count);
}

@Override
public void run() {
    addCount();
}

public static void main(String[] args) {
    VolatitleNoAtomic[] arr = new VolatitleNoAtomic[10];
    for (int i = 0 ; i < 10 ; i++){
        arr[i] = new VolatitleNoAtomic();
    }
    for (int i = 0 ; i < 10 ; i++){
        arr[i].start();
    }
}
}

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

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容