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

发布于 2022-09-05 22:09:19 字数 172 浏览 33 评论 0

假设单核CPU的情况下。(既高速缓存都是一样的)

一 一个变量a被线程A和线程B共享,A、B线程同时做a++操作。CPU切换时间片实际还是顺序操作,会有问题吗?如何理解?
二 一个变量a被线程A和线程B共享,A写,B读,会出现B读不到最新的值吗?

应该如何解释清楚以及如何证明(官方文档等)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

一笔一画续写前缘 2022-09-12 22:09:19

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

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

-小熊_ 2022-09-12 22:09:19

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

水染的天色ゝ 2022-09-12 22:09:19

即使是单核CPU,多线程访问共享内存还是需要同步。
详见Java的内存模型:
http://www.infoq.com/cn/artic...
或者看JAVA语言规范内存模型的部分。

烂柯人 2022-09-12 22:09:19

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

你曾走过我的故事 2022-09-12 22:09:19

即使是在单核场景下,还是需要考虑多线程的问题的。

具体可以看下JMM,java内存模型

傲影 2022-09-12 22:09:19

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

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

逆夏时光 2022-09-12 22:09:19

上面的老哥们都没答到点子上啊,扯什么JMM,多线程不就是以前单核处理器下才出来的技术吗,多线程在单核时代就是线程轮流跑,只是CPU速度快,人感觉不到以为线程是在同步运行的。

过期情话 2022-09-12 22:09:19

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文