2026年物业门控五金耗材推荐榜:中企创联工业品,小区/写字楼/物业多场景门控配件全覆盖
2026/3/2 14:07:46
上述规约是一个关于Java并发编程的重要问题。本篇博文我来详细解释一下:
publicclassVolatileExample{privatevolatilebooleanflag=false;publicvoidwriter(){flag=true;// 写操作}publicvoidreader(){if(flag){// 读操作// 一定能看到最新值}}}publicclassCounter{privatevolatileintcount=0;// 多线程调用会有问题publicvoidincrement(){count++;// 不是原子操作:读→改→写}}问题分析:
线程A:读取count=0 线程B:读取count=0 线程A:count+1=1,写回 线程B:count+1=1,写回 // 结果应该是2,实际是1importjava.util.concurrent.atomic.AtomicInteger;publicclassAtomicExample{privateAtomicIntegercount=newAtomicInteger(0);publicvoidincrement(){count.incrementAndGet();// 原子操作}publicintget(){returncount.get();}}原理:基于CAS(Compare And Swap)
publicfinalintincrementAndGet(){returnunsafe.getAndAddInt(this,valueOffset,1)+1;}// 实际是自旋CAS操作importjava.util.concurrent.atomic.LongAdder;publicclassLongAdderExample{privateLongAddercount=newLongAdder();publicvoidincrement(){count.increment();// 性能更好}publiclongsum(){returncount.sum();}}| 特性 | AtomicLong | LongAdder |
|---|---|---|
| 原理 | CAS自旋 | 分段CAS |
| 高并发写性能 | 一般 | 优秀 |
| 读性能 | O(1) | O(N)需要合并 |
| 内存占用 | 低 | 较高 |
| 适用场景 | 读写均衡 | 写多读少 |
importjava.util.concurrent.atomic.AtomicInteger;importjava.util.concurrent.atomic.LongAdder;importjava.util.concurrent.CountDownLatch;publicclassCounterComparison{// 方案1:volatile(不安全)privatevolatileintvolatileCount=0;// 方案2:AtomicIntegerprivateAtomicIntegeratomicCount=newAtomicInteger(0);// 方案3:LongAdder(JDK8+推荐)privateLongAdderadderCount=newLongAdder();publicvoidtestVolatile()throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(100);for(inti=0;i<100;i++){newThread(()->{for(intj=0;j<1000;j++){volatileCount++;// 线程不安全}latch.countDown();}).start();}latch.await();System.out.println("Volatile结果(可能不正确): "+volatileCount);}publicvoidtestAtomic()throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(100);for(inti=0;i<100;i++){newThread(()->{for(intj=0;j<1000;j++){atomicCount.incrementAndGet();}latch.countDown();}).start();}latch.await();System.out.println("AtomicInteger结果: "+atomicCount.get());}publicvoidtestLongAdder()throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(100);for(inti=0;i<100;i++){newThread(()->{for(intj=0;j<1000;j++){adderCount.increment();}latch.countDown();}).start();}latch.await();System.out.println("LongAdder结果: "+adderCount.sum());}publicstaticvoidmain(String[]args)throwsInterruptedException{CounterComparisontest=newCounterComparison();test.testAtomic();test.testLongAdder();test.testVolatile();}}volatileAtomicInteger/AtomicLongLongAdder(JDK8+)Atomic系列(LongAdder的sum()可能不是实时精确值)volatile只解决可见性问题,不解决原子性问题count++这类复合操作,必须使用原子类LongAdder性能通常优于AtomicLong