为了账号安全,请及时绑定邮箱和手机立即绑定

java多线程在单核CPU上,还是需要volatile synchronized吗?

java多线程在单核CPU上,还是需要volatile synchronized吗?

杨魅力 2019-03-01 10:31:56
假设单核CPU的情况下。(既高速缓存都是一样的) 一 一个变量a被线程A和线程B共享,A、B线程同时做a++操作。CPU切换时间片实际还是顺序操作,会有问题吗?如何理解?二 一个变量a被线程A和线程B共享,A写,B读,会出现B读不到最新的值吗? 应该如何解释清楚以及如何证明(官方文档等)?
查看完整描述

8 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

每个线程还是可能会有自己的堆栈和寄存器,不能假设 CPU 单核等同于同步,而是要遵守 Java 多线程模型来设计代码。

查看完整回答
反对 回复 2019-03-01
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

乱序的意思是线程可以在任意时刻被切换, 所以即使是单核, 也有可能一个线程正在执行某个函数体的时候, CPU开小差跑去执行另一个线程了的函数了, 所以还是需要的.

如果是JavaScript的事件模型, 就不需要了, 因为其事件循环机制会确保执行另一个task(不是线程)的时候, 当前正在执行的函数栈一定是空的, 即在一个函数调用完全结束之后, 才会执行下一个函数. 所以写NodeJS的时候压根不需要考虑并发导致的线程安全问题.

查看完整回答
反对 回复 2019-03-01
?
BIG阳

TA贡献1859条经验 获得超6个赞

没有东西保证你读到。原则上,一个没有保证的东西不出错也只是运气好,不要写依赖于运气的程序。

如果要设计一个实验: JVM的double读写不保证是原子的,在32位机器上很可能实际也不是原子的。你可以试试多线程同时读写一个double变量。

查看完整回答
反对 回复 2019-03-01
?
跃然一笑

TA贡献1826条经验 获得超6个赞

兄弟,举个例子啊,比如i++,需要三个操作吧(读,+1,写),如果A线程在进行+1之后没来的急写,CPU调用B线程i++,那么下次在调用A线程时直接写,是会覆盖B的更新的,

查看完整回答
反对 回复 2019-03-01
?
狐的传说

TA贡献1804条经验 获得超3个赞

程序的线程和cpu的核数没关联吧 小白求别喷

查看完整回答
反对 回复 2019-03-01
  • 8 回答
  • 0 关注
  • 981 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信