返回信息流看完核心思想的线程章节,自己写了个银行转账系统。如果当前账户余额不足时,会调用Condition.await()方法进入阻塞,等到其他账户转账完毕之后调用signalAll()方法,重新进入可运行状态。
代码结构如下
transfer(){
try{
lock.lock()
while(count<assset)
cn.await()
//转账代码
condition.signalAll();
}catch
...
}finally{
lock.unlock()
}
}
若线程1进入阻塞状态之后,由线程2唤醒,并获得锁,那么线程2到底是从那行代码开始执行的呢;
我实际在跑的时候,发现线程2执行完毕使得线程1满足条件,线程1获得锁执行时,还是不执行转账部分的代码。
也许还有其他原因,贴代码,求大婶。
银行类提供新建账户和转账功能
Account类提供账户余额增减功能
job类是具体的工作调度,生成两个转账线程,并执行。
这是一条镜像帖。来源:北邮人论坛 / java / #42932同步于 2015/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【已解决,thx ai question】signalAll相关线程之后,相关线程
liu487639
2015/7/21镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
两种可能:
job1获得锁并开始执行时,并没有更新本身携带对象的参数;
job1获得锁更新了本身携带对象的参数,但未进行比较。
所以想知道当job1线程重新获得锁之后,是从哪里开始执行的?又是如何共享对象的。
代码里如果有其他问题,欢迎指正,小白在此谢过各位大神。
PS:请无视屎黄色色的背景和字体[ema41]
啊,脑残了,没看全代码。。。默默地删掉。。
【 在 liu487639 的大作中提到: 】
: 看完核心思想的线程章节,自己写了个银行转账系统。如果当前账户余额不足时,会调用Condition.await()方法进入阻塞,等到其他账户转账完毕之后调用signalAll()方法,重新进入可运行状态。
: 代码结构如下
: transfer(){
: ...................
感觉,气氛上说,是因为那个while(count>asset)一直循环了。
job1开始的时候,count=200, asset=10x.x
然后job2改了Account1里的asset,但是这个临时变量asset还是10x.x
lz可以改成while(count>accout1.getAsset())试下。
然后顺便给private double asset;的定义加一个volitate试试吧,因为即使Job2更新了Account1的asset,它也有可能在第一个线程内存里有cache,所以还是10x.x
【 在 liu487639 的大作中提到: 】
: 看完核心思想的线程章节,自己写了个银行转账系统。如果当前账户余额不足时,会调用Condition.await()方法进入阻塞,等到其他账户转账完毕之后调用signalAll()方法,重新进入可运行状态。
: 代码结构如下
: transfer(){
: ...................
thx,晚上撸串撸多了,整个人轻飘飘的,明早试试,万分感谢。线程1重新执行的时候是从哪开始的呢
【 在 aiquestion 的大作中提到: 】
: 感觉,气氛上说,是因为那个while(count>asset)一直循环了。
: job1开始的时候,count=200, asset=10x.x
: 然后job2改了Account1里的asset,但是这个临时变量asset还是10x.x
: ...................
确实是这个问题,应该重新取值,另外关键字是volatile,java和C不同
【 在 aiquestion 的大作中提到: 】
: 感觉,气氛上说,是因为那个while(count>asset)一直循环了。
: job1开始的时候,count=200, asset=10x.x
: 然后job2改了Account1里的asset,但是这个临时变量asset还是10x.x
: ...................
从wait结束开始执行,你可以理解成进wait以后就停了,notify之后wait就执行完反回了。
【 在 liu487639 的大作中提到: 】
: thx,晚上撸串撸多了,整个人轻飘飘的,明早试试,万分感谢。线程1重新执行的时候是从哪开始的呢
来自「北邮人论坛手机版」
搜嘎,一直不会拼,临时百度了一下
【 在 liu487639 的大作中提到: 】
: 确实是这个问题,应该重新取值,另外关键字是volatile,java和C不同
来自「北邮人论坛手机版」