易失性并与多线程同步不起作用

时间:2018-09-14 10:11:20

标签: java volatile

public class VolatileDemo implements Runnable{

private static volatile int count = 0;
private Random random = new Random();

public static void main(String[] args) {
    for(int i=0;i<1000;i++){
        new Thread(new VolatileDemo()).start();
    }
    while(Thread.activeCount()>1){
        Thread.yield();
    }
    System.out.println(count);
}

@Override
public synchronized void run() {
    try {
        Thread.sleep(random.nextInt(1000));
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+" " + count++);
}

}

运行(在jdk1.8中)后,答案不是1000。请告诉我原因。

1 个答案:

答案 0 :(得分:0)

易失性对于“增量”操作并不安全,因为它不是原子的(读,增量,写) 挥发只是保证对变量进行的更改将对所有读取该变量的线程可用。

对于安全增量操作,您应该改为“原子”变量