已采纳回答 / 特南克斯
main 线程是会和 new 出来的线程并行执行的,如果没有那个 while 判断,下面这行代码<...code...>就会在其他线程执行完之前就执行了。加 while 判断,就是为了等五百个线程执行完毕
2018-10-14
已采纳回答 / 自有如风
你看看这样能不能理解:number的值可以存在三个地方:主内存,cpu缓存,cpu寄存器。因为加上了volatile关键字,cpu每次对number的读取都强迫cpu缓存从主内存中读取。但是count++操作有三步,读count,计算count+1,将计算的结果给count。假设读count已经执行了,number已经放到了cpu寄存器中。此时当执行权被其他线程抢走之后再次轮到当前线程执行的时候,已经不需要再读number了。故number还是没有变化
2018-08-10
已采纳回答 / 一叶秋才
这个Dome告诉你 编译时可能存在其它结果,导致数据不安全
public static void main(String[] args) { SynchronizedDemo synchronizedDemo=new SynchronizedDemo(); synchronizedDemo.new ReadWriteThread(true).st...
2018-06-07
已采纳回答 / annnn
A线程的工作变量里已经读过number=5,B线程改变以后number=6后,的确会强迫store到主内存,但是这与A线程的工作变量无关,A线程读取的时候已经load过了,不会主动再load,所以number=5
2018-03-18
已采纳回答 / 忧伤的帅哥
不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。java内存中的变量都有指针引用,上下文引用成链,这个链是不会被打乱重排序的,只有没有数据依赖关系的代码,才会被冲排序,所以在单线程内部重排序不会改变程序运行结果,这就是as-if-serial
2017-06-22
已采纳回答 / zvc888
每个线程都有一个自己的内存空间,当线程启动的时候把变量从共享内存拷贝一份到私有内存,在这个变量更改后,需要push到共享内存,其他线程才能读取到变量新的值;
2017-02-19