java 线程问题

沐纪尘 2018-05-17 09:16:00
我把java核心编程思想的线程同步的银行转账代码加了几句测试代码,用来测试在线程进入Bank类bank对象的transfer方法的同步代码区域前后对bank对象的num成员的改变。

然后每个线程运行run方法时会调用bank对象的transfer方法

在transfer方法中会把线程ID赋值给num,代表num成员发生变化

我开了十个线程进行对transfer方法的使用,每个线程start后,线程9号执行到第3句输出语句(此时num为0)然后被剥夺运行权,

**重点到了,此时轮到线程4号运行,它改变num的值,把ID值为14赋值给num,此时num==14
问题如下图

望大神指点一下为什么又轮到线程9号执行时这第4句输出(0++++++++++++++4Thread[Thread-9,5,main])num还是0到下一句第5句(14++++++++++++++5Thread[Thread-9,5,main])num就变成14了,是否涉及到java内存模型,以及其他的原因

...全文
862 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zclqianqian 2018-06-20
  • 打赏
  • 举报
回复
要用volatile来修饰num,这样一个线程中改变了num,其他线程获取最新的就是改变后的。
weixin_41404782 2018-06-19
  • 打赏
  • 举报
回复
这个问题,需要了解java的内存模型。 简单来说,一个实例变量,在两个不同线程中,各有一份拷贝(或者叫缓存),供线程自己使用。 要想保证两个线程获取统一的结果,必须 在同步代码中 获取这个值。 如果你不想为这么点小事,就进入同步代码,可以将此实例变量用volatile关键字修饰。
dgqjava 2018-05-21
  • 打赏
  • 举报
回复
引用 2 楼 m0_37075681 的回复:
就是说没执行lock前,对于线程来说无法确保对象成员什么时候会刷新,线程能否观察到最新值是具有随机性的? 可以保证的是 线程执行lock后必定读取所有已刷新的成员变量,退出时必定会把已修改的所有成员变量刷新为最新值?
是这样的
dgqjava 2018-05-18
  • 打赏
  • 举报
回复
在lock执行前 无法确保观察到num的最新值
沐纪尘 2018-05-18
  • 打赏
  • 举报
回复
就是说没执行lock前,对于线程来说无法确保对象成员什么时候会刷新,线程能否观察到最新值是具有随机性的? 可以保证的是 线程执行lock后必定读取所有已刷新的成员变量,退出时必定会把已修改的所有成员变量刷新为最新值?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧