1. 程式人生 > 其它 >2.volatile不保證原子性

2.volatile不保證原子性

 

 

package com.mydemo;

public class MyData2 {
    volatile int number=0;
    public void addPlusPlus() {
        number ++;
    }
}
class VolatileAtomicityDemo {
    public static void main(String[] args) {
        MyData2 myData = new MyData2();
        for (int i = 0; i < 20; i++) {
            
new Thread(()->{ for (int i1 = 0; i1 < 1000; i1++) { myData.addPlusPlus(); } },"AAA").start(); } while (Thread.activeCount()>2){ Thread.yield(); } System.out.println(Thread.currentThread().getName()
+" 最終值:"+myData.number); } }

執行結果:最後的結果總是小於20000。

 

 2.使用原子整形

package com.mydemo;

import java.util.concurrent.atomic.AtomicInteger;

public class MyData2 {
    volatile int number=0;
    AtomicInteger atomicInteger=new AtomicInteger();
    public void addPlusPlus() {
        number ++;
    }
    
public void addPlusPlus2(){ atomicInteger.getAndIncrement(); } } class VolatileAtomicityDemo { public static void main(String[] args) { MyData2 myData = new MyData2(); for (int i = 0; i < 20; i++) { new Thread(()->{ for (int i1 = 0; i1 < 1000; i1++) { myData.addPlusPlus(); myData.addPlusPlus2(); } },"AAA").start(); } while (Thread.activeCount()>2){ Thread.yield(); } System.out.println(Thread.currentThread().getName()+" 最終值:"+myData.number); System.out.println(Thread.currentThread().getName()+" 最終值:"+myData.atomicInteger); } }