最赞回答 / 是麥兜啊
while循环内判断的是所有的子线程是否都运行完了,如果是的话,继续下面的打印操作。如果不用synchronized或不加锁,程序运行时,有时候getNumber获得的值小于500,是因为volatile定义的变量不能保证原子性,所以会出现两个线程同时写number时,number只增加了1,没有增加2,所以影响到number变量最终的值不是500,而是499或498了。
2017-07-07
已采纳回答 / 忧伤的帅哥
不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。java内存中的变量都有指针引用,上下文引用成链,这个链是不会被打乱重排序的,只有没有数据依赖关系的代码,才会被冲排序,所以在单线程内部重排序不会改变程序运行结果,这就是as-if-serial
2017-06-22