java多线程在单核CPU上,还是需要volatile synchronized吗?
假设单核CPU的情况下。(既高速缓存都是一样的)
一 一个变量a被线程A和线程B共享,A、B线程同时做a++操作。CPU切换时间片实际还是顺序操作,会有问题吗?如何理解?
二 一个变量a被线程A和线程B共享,A写,B读,会出现B读不到最新的值吗?
应该如何解释清楚以及如何证明(官方文档等)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
乱序的意思是线程可以在任意时刻被切换, 所以即使是单核, 也有可能一个线程正在执行某个函数体的时候, CPU开小差跑去执行另一个线程了的函数了, 所以还是需要的.
如果是JavaScript的事件模型, 就不需要了, 因为其事件循环机制会确保执行另一个task(不是线程)的时候, 当前正在执行的函数栈一定是空的, 即在一个函数调用完全结束之后, 才会执行下一个函数. 所以写NodeJS的时候压根不需要考虑并发导致的线程安全问题.
兄弟,举个例子啊,比如i++,需要三个操作吧(读,+1,写),如果A线程在进行+1之后没来的急写,CPU调用B线程i++,那么下次在调用A线程时直接写,是会覆盖B的更新的,
即使是单核CPU,多线程访问共享内存还是需要同步。
详见Java的内存模型:
http://www.infoq.com/cn/artic...
或者看JAVA语言规范内存模型的部分。
每个线程还是可能会有自己的堆栈和寄存器,不能假设 CPU 单核等同于同步,而是要遵守 Java 多线程模型来设计代码。
即使是在单核场景下,还是需要考虑多线程的问题的。
具体可以看下JMM,java内存模型
没有东西保证你读到。原则上,一个没有保证的东西不出错也只是运气好,不要写依赖于运气的程序。
如果要设计一个实验: JVM的double读写不保证是原子的,在32位机器上很可能实际也不是原子的。你可以试试多线程同时读写一个double变量。
上面的老哥们都没答到点子上啊,扯什么JMM,多线程不就是以前单核处理器下才出来的技术吗,多线程在单核时代就是线程轮流跑,只是CPU速度快,人感觉不到以为线程是在同步运行的。
程序的线程和cpu的核数没关联吧 小白求别喷