java中原子计数器AtomicInteger使用

    科技2023-10-12  99

    package test.thraed;

    import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger;

    public class Counter { private AtomicInteger atomicI = new AtomicInteger(0); private int i = 0;

    public static void main(String[] args) { final Counter cas = new Counter(); List<Thread> threads = new ArrayList<>(600); //初始化100个线程,每个线程执行1w次计数 for(int j=0; j<100; j++) { Thread thread = new Thread(new Runnable() { @Override public void run() { for(int i=0; i<10000; i++){ cas.safeCount(); cas.count(); } } }); threads.add(thread); } for (Thread thread : threads) { thread.start(); } //等待所有线程执行完成 for(Thread thread : threads) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } //非线程安全的结果:<100w System.out.println("非线程安全的结果 :"+cas.i); //线程安全的结果: 100w System.out.println("线程安全的结果 :"+cas.atomicI.get()); } /** * 使用CAS实现线程安全计数 */ private void safeCount() { //自旋CAS,直到成功跳出循环 for(;;) { int i = atomicI.get(); boolean suc = atomicI.compareAndSet(i, ++i); if (suc) { break; } } } /** * 非线程安全计数 */ private void count() { i++; }

    }

    效果:

    Processed: 0.016, SQL: 9