AtomicReference类提供了对象引用的非阻塞原子性读写操作,并且提供了其他一些高级的用法,对象的引用其实是一个4字节的数字,代表着在JVM堆内存中的引用地址,对一个4字节数字的读取操作和写入操作本身就是原子性的
package AtomicTest;
import disruptor.WwwApplication;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
/**
* desc:
* author:wangqiangac
* date:2024/1/5 15:49
*/
@Slf4j
@SpringBootTest(classes= WwwApplication.class)
public class AtomicReferenceTest {
//volatile DebitCard debitCard = new DebitCard("WangQiang", 0);
AtomicInteger atomicInteger = new AtomicInteger(0);
private static AtomicReference debitCardRef = new AtomicReference(new DebitCard("WangQiang",0));
@Test
public void test() throws InterruptedException, ExecutionException {
ThreadPoolBuilder threadPoolBuilder = new ThreadPoolBuilder();
threadPoolBuilder.setCorePoolSize(50).setMaxPoolSize(100).setKeepAliveSeconds(120).setQueueCapacity(20)
.setThreadNamePrefix("王强的线程").setPrestartAllCoreThreads(true).setRejectedExecutionHandler(new BlockPolicy());
ThreadPoolExecutor threadPoolExecutor = threadPoolBuilder.builderThreadPoolExecutor();
List<Callable<DebitCard>> callables = new ArrayList<>();
for (int i = 0; i < 8; i++) {
callables.add(()->{
atomicInteger.getAndIncrement();
DebitCard debitCard = null;
DebitCard extracted = extracted();
return extracted;
});
}
List<Future<DebitCard>> futures = threadPoolExecutor.invokeAll(callables);
for (Future f: futures) {
log.error(f.get().toString());
}
log.error(debitCardRef.get().toString()+"atomicInteger:"+atomicInteger.get());
}
private static DebitCard extracted() {
DebitCard debitCard;
debitCard = (DebitCard) debitCardRef.get();
DebitCard debitCards = new DebitCard(debitCard.getAccount(),debitCard.getAmount()+1);
if(debitCardRef.compareAndSet(debitCard, debitCards)){
log.error(debitCards.toString());
return debitCards;
}else{
log.error("和期望的不一样");
extracted();
return new DebitCard("出现和期望值不一样自旋了",888);
}
}
}