什么叫原子性?
保证数据的完整,一致性,不可分割。
一个线程的操作中间不能被分隔,不能被其他线程覆盖。
i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写”
从变量i中读取读取i的值->值+1 ->将+1后的值写回i中
程序:有20个线程,每个线程执行1000次number++
public class VolatileTest {
public static void main(String[] args) {
MyTest myTest = new MyTest();
for (int i = 0; i < 20; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 1000; j++) {
myTest.add();
}
}
},String.valueOf(i)).start();
}
//当上面20个线程结束后执行下面程序
while (Thread.activeCount() > 2){
//否则让出cup时间片
Thread.yield();
}
//打印number的值
System.out.println(Thread.currentThread().getName()+" : "+myTest.number);
}
}
class MyTest{
volatile int number = 0;
public void add(){
number++;
}
}
控制台多次打印结果:
和我们的预期结果不一致