问题:开户10000,其中张三隔一段时间存入100,李四隔一段时间取出100,王五隔一段时间取出200。存款金额不能超过20,000。取款为0时停止,这个阶段如何保证数据一致性解决方案:将开户金额设置为atomic原子类,将取款和存款设置为synchronized解决该问题开户类Accountpackagecom.currency.currency05;importlombok.Data;导入java。util.concurrent.atomic.AtomicInteger;@DatapublicclassAccount{私有字符串名称;私人原子整数数量;publicvoidname(){System.out.println("账号是:"+name+"!");}publicsynchronizedbooleandeposit(StringthreadName,Integerchange){amount.addAndGet(change);if(amount.get()>20000){System.out.print("充值金额已达到上限,充值失败");返回假;}System.out.println("01:"+threadName+",充值金额为"+change+",开始充值,充值后余额为"+amount");返回真;}publicsynchronizedbooleanwithdraw(StringthreadName,Integermoney){if(amount.get()<=0||amount.get()=20000){中断;}if(account.getAmount().get()==0){System.out.println("余款为零,存款结束");休息;}}}}存款类Withdrawpackagecom.currency.currency05;importjava.util.Random;/***@authorhuanglaoxie(微信:yfct-8888)*@classNameWithdraw*@description:*@date2017/12/2010:16*/publicclassWithdrawimplementsRunnable{privateAccountaccount;私人撤回;publicvoidwithdraw(Accountaccount,intwithdraw){this.account=account;this.withdraw=退出;}@Overridepublicvoidrun(){StringthreadName=Thread.currentThread().getName();while(true){if(account.getAmount().get()>0){booleanisFlag=account.withdraw(threadName,withdraw);如果(!isFlag){中断;}尝试{Thread.sleep(newRandom().nextInt(1000));}catch(InterruptedExceptione){e.printStackTrace();}}else{休息;}}}}线路执行包com.currency.currency05;publicclassTest{publicstaticvoidmain(String[]args){Accountaccount=newAccount();account.openAccount("周周",10000);存款p1=newDeposit();p1.存款(账户,100);ThreaddepositThread=newThread(p1,"张三");取款p2=newWithdraw();p2.withdraw(账户,100);线程退出Thread1=newThread(p2,"李四");撤回p3=newWithdraw();p3.withdraw(账户,200);ThreadwithdrawThread2=newThread(p3,"王舞");withdrawThread1.start();withdrawThread2.start();depositThread.start();}}测试结果00:舟舟成功开户,开户金额1,000,002:李四,出金金额100,开始出金,出金后余额990,001:张三,入金金额100,开始充值,充值后余额1,000002:王五,提现金额200,开始提现,提现后余额980002:王五,提现金额200,开始提现,提现后余额960001:张三,入金100,开始入金,入金后余额970002:李四,出金100,开始出金,出金后余额960002:王五,出金200,开始提现,提现后余额940001:张三,充值金额100,开始充值,充值后余额950001:张三,充值金额100,开始充值,充值后余额960002:王五,提现金额200,开始提现,提现后余额940002:王五,提现金额200,开始提现,提现后余额920002:李四,提现金额100,开始提现,提现后余额为910002:王五,取款金额为200,开始取款,取款后余额为890001:张三,充值金额为100,开始充值,充值后余额为900002:李四,取款金额为100,开始取款,取款后余额890002:王五,取款金额200,开始取款,取款后余额870002:李四,取款金额100,开始取款,取款后余额860002:李四,提现金额100,开始提现,提现后余额850002:王五,提现金额200,开始提现,提现后余额830001:张三,充值金额100,开始充值,余额存款后是840002;:王舞,取款额度是200,开始提现,提现后余额为800001:张三,充值金额为100,开始充值,充值后余额为810002:李四,提现金额为100,开始提现,提现后余额为800001:张三,充值金额100,开始充值,充值后余额为810002:王五,提现金额为200,开始提现,提现后余额为790002:李四,提现金额为100,开始提现,提现后余额为780001:张三,充值金额为100,开始充值,充值后余额为790002:王五,提现金额为200,开始提现,提现后余额为770001:张三,充值金额为100,开始充值,充值后余额780002:李四,提现金额100,开始提现,提现后余额770001:张三,充值金额100,开始充值,充值后余额780002:李四,提现金额100,开始提现,提现后余额770002:李四,提现金额100,开始提现,提现后余额760001:张三,充值100,开始充值,充值后余额770002:王五,提现金额200,开始提现,提现后余额750002:李四,提现金额100,开始提现,提现后余额740002:李四,提现金额100,开始提现,提现后余额730001:张三,充值金额100,开始充值,充值后余额740001:张三,充值金额100,开始充值,充值后余额750002;李四,提现金额100,开始提现,提现后余额740002;:王五,提现额度200,提现后提现额度700000。690002:李四,提现金额100,开始提现,提现后余额680002:王五,提现金额200,开始提现,提现后余额660001:张三,入金金额100,开始充值,充值后余额670002:王五,提现金额200,开始提现,提现后余额650002:李四,提现金额100,开始提现,提现后余额640001:张三,充值金额100,开始充值,充值后余额650001:张三,充值金额100,开始充值,充值后余额660002:李四,提款金额100,开始提现,提现后余额为650001:张三,存款金额为100,开始充值,充值后余额660002:王五,提现金额200,开始提现,提现后余额640002:李四,提现金额100,开始提现,提现后余额630001:张三,充值100,开始充值,充值后余额为640001张三,充值金额100,开始充值,充值后余额为650002:李四,提现金额100,开始提现,提现后余额640002:王五,提现金额200,提现开始,提现后余额620002:李四,提现金额100,提现开始,提现后余额610002:李四,取款金额100,开始取款,取款后余额600001:张三,充值金额100,开始充值,充值后余额610002:王五,取款金额200,开始出金,出金后余额590002:王五,出金金额200,开始出金,出金后余额570002:李四,出金金额100,开始出金,出金后余额560001:张三,存款金额为100,开始充值,充值后余额为570002:李四,提现金额为100,开始提现,提现后余额为560002:王5,提现金额为200,开始提现,提现后余额为540001:张三,充值金额100,开始充值,充值后余额550001:张三,充值金额100,开始充值,充值后余额560002:王五,提现额度200,提现额度200,取款后余额为540002;王五,提现金额200,提现金额520002;:李四,取款金额100,开始取款,取款后余额500001:张三,充值金额100,开始充值,充值后余额510002:王五,取款金额200,开始提现,提现后余额490002:李四,提现金额100,开始提现,提现后余额480002:王五,提现金额200,开始提现,提现后余额460001:张三,入金100,开始入金,入金后余额470002:李四,出金100,开始出金,出金后余额460002:王五,出金200,开始提现,提现后余额440002:李四,提现金额100,开始提现,提现后余额430001:张三,充值金额100,开始充值,充值后余额440001:张三,入金金额100,开始入金,入金后余额450002:王五,出金金额200,开始提现,提现后余额为430002:李四,提现金额为100,开始提现,提现后余额为420002:王五,提现金额为200,开始提现,提现后余额为400002:李四,提现金额100,开始提现,提现后余额390002:李四,提现金额100,开始提现,提现后余额380001:张三,充值金额100,开始充值,充值后余额390001:张三,充值金额100,开始充值,充值后余额400002:王五,提现金额200,开始提现,提现后余额380001:张三,充值金额100,开始充值,入金后余额为390002:李四,取款金额100,取款金额100,取款金额380002.:王五,取款金额200,取款后取款金额330002.300001:张三,充值金额为100,开始充值,充值后余额为310002:李四,提款金额为100,开始提款,提款后余额为300002:王五,提款金额为200,开始提现,提现后余额280001:张三,充值金额100,开始充值,充值后余额290001:张三,充值金额100,开始充值,充值后余额300001:张三,入金金额100,开始入金,入金后余额310002:王五,出金金额200,开始出金,出金后余额290002:李四,出金金额100,开始出金,出金后余额提现为280002:王五,提现金额为200,开始提现,提现后余额为260001:张三,存款金额为100,开始存款,存款后余额为270001:张三,存款金额为100,开始充值,充值后余额为280001:张三,充值金额为100,开始充值,充值后余额为290002:李四,提现金额为100,开始提现,提现后余额为280001:张三,充值金额为100,开始充值,充值后余额为290002:王五,提现金额为200,开始提现,提现后余额为270001:张三,充值金额为100,开始充值,入金后余额为280002:李四,出金金额为100,开始提现,出金后余额为270002:王五,出金金额为200,开始提现,提现后余额为250001:张三,充值金额为100,开始充值,充值后余额为260002:王五,提现金额为200,开始提现,提现后余额为240002:王五,提现金额200,开始提现,提现后余额220002:李四,提现金额100,开始提现,提现后余额210002:李四,提现金额100,开始提现,提现后余额200002:王五,提现金额200,开始提现,提现后余额180001:张三,充值金额100,开始充值,充值后余额190002:李四,提现金额100,开始取款,取款后余额180002:王五,取款金额200,开始取款,取款后余额160001:张三,充值金额100,开始充值,充值后余额170001:张三,充值金额100,开始充值,充值后余额为180002:王五,提现金额为200,开始提现,提现后余额为160002:李斯,提现金额为100,开始提现,提现后余额为150001:张三,充值金额100,开始充值,充值后余额160002:王五,提现金额200,开始提现,提现后余额140001:张三,充值金额100,开始充值,充值后余额150002:王五,提现金额200,开始提现,提现后余额130002:王五,提现金额200,开始提现,提现后余额110001;:王五,提现额度200,提现后提现额度90000。80002:李四,提现金额100,开始提现,提现后余额70002:王五,提现金额200,开始提现,提现后余额50001:张三,入金金额100,开始充值,充值后余额60002:李四,提现额度100,提现后提现额度50000。余额20001:张三,充值金额100,开始充值,充值后余额30002:李四,提现金额100,开始提现,提现后余额20002:王五,提现金额是200,开始提现,之后提现金额为0,余额为0,充值结束Processfinishedwithexitcode0github