最近在工作中和一个同事因为自增是不是原子性操作争论的面红耳赤,那Java的自增操作到底是不是原子性操作呢,答案是否的,即Java的自增操作不是原子性操作。
1.首先我们先看看Bruce Eckel是怎么说的:
In the JVM an increment is not atomic and involves both a read and a write. (via the latest Java Performance Tuning Newsletter)
意思很简单,就是说在jvm中自增不是原子性操作,它包含一个读操作和一个写操作。
/** * * @author renrun.wu */ public class MultiThread implements Runnable { private int count; private int amount = 1; public MultiThread() { count = 100; } public MultiThread(int count) { this.count = count; } @Override public void run() { for (int i = 0; i < count; i++) { amount++; } } public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); MultiThread multiThread =new MultiThread(); for (int i = 0; i < 100; i++) { executorService.execute(multiThread); } executorService.shutdown(); try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(multiThread.amount); } }