代码如下:
import com.dcy.pojo.Prize;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class TestPrize {
static AtomicInteger atomicInteger = new AtomicInteger(30);
static AtomicInteger atomicInteger1 = new AtomicInteger(0);
static ExecutorService pool = Executors.newFixedThreadPool(5);
static ArrayList<Prize> prizes = new ArrayList<>();
public static void main(String[] args) throws InterruptedException {
Prize p = new Prize();
p.setActId(74);
p.setSiteId(1001l);
p.setPrizeLeft(30);
prizes.add(p);
for (int i=0;i<100;i++) {
pool.execute(new TestCAS());
}
Thread.sleep(3000);
System.out.println("atomicInteger1="+atomicInteger1.get());
}
static class TestCAS implements Runnable {
@Override
public void run() {
for (Prize prize : prizes) {
if (prize.getActId()==74) {
int left =-1;
if( (left=prize.getPrizeLeft().decrementAndGet())>=0){
atomicInteger1.incrementAndGet();
System.out.println("atomicInteger:"+atomicInteger.decrementAndGet()+"---"+Thread.currentThread().getName()+"left="+left);
prize.setPrizeLeft(left);
}
}
}
}
}
}
代码最后打印出来的atomicInteger1 多半都大于30,并且注意到left有多次打印重复的情况。为什么prize.getPrizeLeft().decrementAndGet()会返回相同的值?