多线程读脏数据

您所在的位置:网站首页 多线程脏读 多线程读脏数据

多线程读脏数据

2023-08-17 08:10| 来源: 网络整理| 查看: 265

案例:

数组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关键字可以实现同步锁。。。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3