这是一个非常概念性的问题。
假设我有 2 个独立的线程。线程 A 不断获取时间并将其存储为变量,线程 B 不断从线程 B 的变量获取时间并用它执行某些操作。
当线程B访问线程A中的变量时,线程A是否停止运行直到操作完成?
扩展一下,如果你有 3 个线程,线程 A 获取当前时间并将其设置为线程 B 中的变量,然后线程 C 读取该变量。
如果在线程 C 读取变量时线程 A 正在分配变量,那么线程是否会停止运行直到 A 完成为止?
感谢您的精彩解答,但现在我还有 1 个问题。如果它们会干扰,那么使多个线程在通信时不竞争的首选解决方案是什么。 (概念上)你会做什么来让这些线程可以共享变量的值,同时保持尽可能快的速度?
最佳答案
内存和线程是两个完全不同的东西。即使是代表线程的类的一部分的变量也只是内存,就像任何线程都可以访问的任何其他内存一样。
然而,使事情变得复杂并实际上导致速度变慢的是处理器缓存:为了使在不同 CPU 上运行的两个线程访问同一 block 内存并“查看”彼此的更改,CPU 缓存必须同步,如果这种情况发生很多,可能会完全抵消这些缓存的(大量)速度优势。
请注意,由于缓存的原因,线程 B 实际上可能会在任意长时间内看到该变量的过时值,除非两者都在同步块(synchronized block)中访问该变量,或者使用关键字 volatile
声明该变量>.
关于java - 两个线程交互会减慢彼此的速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8605952/