Java 在并行处理中,是否有“并行”的概念;不间断块“;?若否,原因为何? 总结
从我的研究中,我不记得有“不间断块”这样的概念存在,我也没有通过快速的谷歌搜索找到它 预期答案Java 在并行处理中,是否有“并行”的概念;不间断块“;?若否,原因为何? 总结,java,multithreading,Java,Multithreading,从我的研究中,我不记得有“不间断块”这样的概念存在,我也没有通过快速的谷歌搜索找到它 预期答案 是的,它确实存在,恰当的术语是。。。(在这种情况下,如果有人能向我解释为什么Java中不存在它,那就太好了) 不,它不存在,因为 定义 我所说的“不间断块”是指多线程上下文中的一段代码,一旦开始执行,就不能被其他线程中断。也就是说,CPU(或JVM)不会运行任何其他线程,直到“原子块”离开。 请注意,这与用lock/mutex/标记的节不同。。。等等,因为只有获得相同锁或互斥锁的其他线程才能中断该
- 是的,它确实存在,恰当的术语是。。。(在这种情况下,如果有人能向我解释为什么Java中不存在它,那就太好了)
- 不,它不存在,因为
a
。收到响应后,它最多有3秒钟发送请求B
。现在,如果有多个线程正在运行,那么在接收到响应A
之后,在原始线程有机会发送请求B
之前,线程会被中断,一个或多个线程会运行,从而错过3秒的截止时间。运行的线程越多,发生这种情况的风险就越大。通过将“接收A
发送B
”部分标记为“不可中断”,可以避免这种情况
请注意,锁定此部分不会解决此问题。(它不会阻止JVM,例如,在“发送请求A
”阶段处理10个新线程,就在我们的线程收到响应A
之后)
编辑:重新编辑。全局互斥。这也不能解决问题。基本上,我希望线程同时发出请求A
(和一些其他东西),但我希望当另一个线程收到响应A
,并将发出请求B
时,它们停止
现在,我知道,这也不是一个100%的解决方案,因为那些在收到响应a
后没有立即进行调度的线程仍然可能错过最后期限。但是,至少,那些这样做的人肯定会及时发出第二个请求
一些进一步的猜测
经典的并发问题a++
可以通过不间断{a++;}
简单地解决,而不需要锁(这可能会导致死锁,而且在任何情况下,在性能方面都可能比简单地执行a++
所需的三条指令(带有一个简单的标志,表示它们不能被中断)更昂贵)
EDITRE.CAS:当然,这也是另一个解决方案。但是,它需要重试,直到写入成功,而且使用起来也稍微复杂一些(至少在Java中,我们必须使用AtomicXXX
,而不是原语类型)
当然,我知道,通过将大块代码标记为不可中断代码,这很容易被滥用,但对于许多并发原语也是如此。(此外,我还知道,我最初的用例也有点“滥用”,因为我将在一个不间断的块中进行I/O,如果Java中确实存在这样的概念,那么至少值得一试。)我假设操作系统不允许这种情况发生,但实际的内核线程除外。一个行为不正常的线程太容易破坏机器。你似乎认为并发结构会影响其他线程。它们不会-它们会影响当前线程。我也看不到你的结构有任何价值-这个假设的块基本上会杀死t计算机在块内-CPU将无法对硬件或软件中断做出响应。这似乎是个坏主意。@Robert/Boris:如果我们只将其限制在同一进程的线程上会怎么样?(在这种情况下,最坏情况下,该进程可能会挂起。)或者为什么他们不在Java中这样做,至少在早期版本中,当有线程时是这样“绿线",这是由JVM安排的?@Attilio这在多核机器中如何工作?在进入这样一个部分之前,你会每隔一个线程暂停一次?在我看来,你想引入一个GIL,而大多数有一个GIL的语言都试图摆脱它。我会说,不,它不存在,因为没有合理的GIL用例r it。要么你想保护资源不受读/写操作的影响,然后还有其他同步原语,要么你想增加线程的优先级,然后就这么做。如果你有严格的截止日期,那么不要使用先发制人的多任务系统。使用像实时操作系统这样的多任务协作系统。