2.volatile不保證原子性
阿新 • • 發佈:2022-04-05
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); } }