java - 两个线程交互会减慢彼此的速度吗?

标签 java android multithreading computer-science communication

这是一个非常概念性的问题。

假设我有 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/

相关文章:

android - 将 google-services 添加到 ChatSecure 后出现 RuntimeException

java - 通过回车键提交方法?

java 。线程执行顺序

c# - 当我断开一个客户端套接字时 Windows 服务关闭

android - 三星 S8 Nougat 始终显示 (AOD) API

java - 如何将除了taskID之外的东西传递给Java线程

java - javafx中是否有SimpleLOngProperty,如果没有那么该怎么办?

java - 如何将大的二进制转换为十进制?

java - 类型转换时不一致(错误: Incompatible types)

java - 端口 80 上的 ServerSocket 正确吗?