你看看这样能不能理解:number的值可以存在三个地方:主内存,cpu缓存,cpu寄存器。因为加上了volatile关键字,cpu每次对number的读取都强迫cpu缓存从主内存中读取。但是count++操作有三步,读count,计算count+1,将计算的结果给count。假设读count已经执行了,number已经放到了cpu寄存器中。此时当执行权被其他线程抢走之后再次轮到当前线程执行的时候,已经不需要再读number了。故number还是没有变化
A线程的工作变量里已经读过number=5,B线程改变以后number=6后,的确会强迫store到主内存,但是这与A线程的工作变量无关,A线程读取的时候已经load过了,不会主动再load,所以number=5
while循环内判断的是所有的子线程是否都运行完了,如果是的话,继续下面的打印操作。
如果不用synchronized或不加锁,程序运行时,有时候getNumber获得的值小于500,是因为volatile定义的变量不能保证原子性,所以会出现两个线程同时写number时,number只增加了1,没有增加2,所以影响到number变量最终的值不是500,而是499或498了。
你根本就不理解。。这个volitate,只对单个操作有效,对i++ 或者其他多步的操作,根本保证不了线程安全
一个线程sleep 后 实际也就释放了执行权 这样可以让其他线程去执行,这样不就达到多个线程交替执行吗?结果就明显了
不然 执行的结果是完全随机的,说不好一个线程执行很久都是有可能的
不会解决。static是修饰变量的,而这里不保证原子性的操作是自增造成的,这二者没啥关系。你好好理解下自增为什么不是一个原子性操作。