这是一个非常概念化的问题。
假设我有2个独立的主题。线程A不断获取时间并将其存储为变量,线程B不断从线程B的变量中获取时间并对其执行某些操作。
当线程B访问线程A中的变量时,线程A是否会停止运行直到操作完成?
要扩展,如果你有3个线程,线程A获取当前时间并将其设置为线程B中的变量,然后线程C读取变量。
如果线程A在线程C读取它的时候正在分配变量,那么线程是否会停止运行直到A完成?
感谢您的回答,但现在我还有一个问题。如果它们会干扰,那么在沟通时使多线程不竞争的首选解决方案是什么。 (从概念上讲)你会怎么做才能让这些线程分享变量的值,同时尽可能快地保持变量?
答案 0 :(得分:4)
记忆和thrads是两个完全不同的东西。即使是代表线程的类的一部分的变量也只是任何线程都可以访问的内存。
然而,实际上导致速度减慢的原因是处理器缓存:为了使在不同CPU上运行的两个线程访问同一块内存并“看到”彼此的更改,CPU缓存必须同步,如果它发生了很多,它可以完全否定这些缓存的(大规模)速度优势。
请注意,由于缓存,线程B实际上可能会在任意长时间内看到变量的过时值,除非两者都访问同步块中的变量,或者使用关键字volatile
声明变量。 / p>
答案 1 :(得分:3)
通常不会,除非您声明getter和setter同步。如果从一个线程调用setter而另一个线程想要访问getter,则必须先等待另一个线程结束他的任务。
我希望我能正确理解这个问题。
答案 2 :(得分:1)
它不会使线程B缓慢线程A。
但:
1.线程A可能会降低线程B的速度。根据系统体系结构(核心和高速缓存),线程A的每次写入都将从线程B的CPU中清除高速缓存行。 B的下一次阅读将更加昂贵
2.如果使用锁来保护数据结构,则两个线程都必须获取它。然后,显然,线程A会减慢
3.如果您不使用锁,并且您的数据类型不是原子的,则可能会读取损坏的数据。例如,如果时间从0x0000ffff变为0x00010000,则可能会读取0x0001ffff。通常,一个整数,在4个字节上对齐,是原子的,所以如果你的时间是time_t,你可能还可以。但细节取决于平台。
答案 3 :(得分:0)
这取决于操作系统和CPU的数量,但基本上是的,当一个线程工作时,另一个线程等待。如果线程B使用线程A使用的变量并不重要,因为它们共享相同的内存。
答案 4 :(得分:0)
是的,他们放慢了速度。
这是因为你的并发检查你在应用程序中编码:因为你有一个锁,信号量,监视器或其他任何东西来规范对存储变量的访问,每个线程可能会等待获得对读/写的独占访问权限变量。
即使你没有并发检查,我也很确定内存不允许同时读取或读/写:因为这种情况可能会发生,所以你的线程将被迫放慢一点