今天看到一道面试题:Java 中 ++ 操作符是线程安全的吗?
答案:不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
对于此答案进行拓展:查到了一些关于i++的线程安全的有关知识:
说起原子性的操作,是指读和写是原子性的,比如i=5;这个就是一个原子性的操作。
但是两个原子性的操作合在一起进行,就不一定是原子性的了,比如先读后写,那么就有可能在读之后这个变量被修改过。
i++就是这样的一个操作,先读后写,所以说整型变量是原子性的,不是说i++就是一个原子性的操作。
在多线程的情况下:当你使用for(int i=0; i<10000; i++){System.out.print(i)}
你会发现,i到最后不会打印出10000,打印出8-9千个数字左右。
所以说在多线程的情况下,就算整型变量是原子性的,也有可能会出现线程安全的问题,这个是线程可见性的问题,所以需要加上volatile声明才行,
该修饰符是强制变量每次从内存中读取,而不会存储在寄存器中。