结果出现1和2 和2,2都好理解,这个1,1的情况我该怎么理解呢??
这个1,1的出现的原因分析如下:共享成员变量num++没有加锁处理,这个操作本质上是三行代码的,volatile只能保证共享变量的修改立即被其它线程看见,而不能保证原子操作。
而num++就应该是一个原子操作。可能这两个线程在同一时刻同时读取到num=0,然后又同时num++将其设置成1了。
多线程环境下的原子操作,只能通过锁来实现,而volatile不能保证原子操作的。
我们项目中也碰到统计操作原子性没保证导致的偏差问题,参考:http://blog.csdn.net/wojiushiwo945you/article/details/42553845
如果你修改num++这行代码为如下,就不会出现11了。
synchronized(num){
num++;
}
http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html
线程没有加锁,导致的结果
这是线程同步的问题
解决办法:在add()上加Synchronize就不会出现那种情况了。
原因是:两个线程同时得到了num这个变量
这种情况是正常的啊,多线程不就是应该这样么?用卖火车票来理解,应该比较容易理解。
没有加锁导致的:
1。首先num++并不是一次完成的,是先把num读取到寄存器里面,修改寄存器再写入内存的,那么就有可能出现这种情况:线程1把num读入寄存器,并加1,这时候线程2也把num读入寄存器,并加1,这时候线程1和2的寄存器中都是"1",线程1写入一次,num就由0变1了,线程2这时候再写入一次,结果自然还是1。
2应该加锁以实现原子访问