多线程读脏数据
案例:
数组account[3]中的三个元素分别表示账户1,账户2,账户3的余额
初始化各账户余额值:account[0]=1000,account[1]=1000,account[2]=5000
线程1功能是将账户1转账500元到账户3中
线程2功能是将账户2转账800元到账户3中
如果线程是安全的那么结果应该是
account[0]=500,account[1]=200,account[2]=6300
但是由于java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),
将会导致数据不准确,相互之间产生冲突,那么可能会出现错误的转账:
导致account[2]的结果比6300小,比如5500,下图描述了过程:
(寄存器是用来暂时存放中间数据)
上例线程不同步,正确的方式是一定要保证线程1完整执行完再执行线程2
1,执行线程1:线程1将5000读入线程1寄存器,转账500后为5500再写回账户3:此时账户3余额为5500.
2,再执行线程2:将5500读入线程2寄存器,转账800后为6300后再写回账户3:此时账户3余额为6300.
正确图:
要实现线程同步,可以采用加锁的方式,java中的synchronized关键字可以实现同步锁。。。