Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在并行处理中,是否有“并行”的概念;不间断块“;?若否,原因为何? 总结_Java_Multithreading - Fatal编程技术网

Java 在并行处理中,是否有“并行”的概念;不间断块“;?若否,原因为何? 总结

Java 在并行处理中,是否有“并行”的概念;不间断块“;?若否,原因为何? 总结,java,multithreading,Java,Multithreading,从我的研究中,我不记得有“不间断块”这样的概念存在,我也没有通过快速的谷歌搜索找到它 预期答案 是的,它确实存在,恰当的术语是。。。(在这种情况下,如果有人能向我解释为什么Java中不存在它,那就太好了) 不,它不存在,因为 定义 我所说的“不间断块”是指多线程上下文中的一段代码,一旦开始执行,就不能被其他线程中断。也就是说,CPU(或JVM)不会运行任何其他线程,直到“原子块”离开。 请注意,这与用lock/mutex/标记的节不同。。。等等,因为只有获得相同锁或互斥锁的其他线程才能中断该

从我的研究中,我不记得有“不间断块”这样的概念存在,我也没有通过快速的谷歌搜索找到它

预期答案
  • 是的,它确实存在,恰当的术语是。。。(在这种情况下,如果有人能向我解释为什么Java中不存在它,那就太好了)
  • 不,它不存在,因为
定义 我所说的“不间断块”是指多线程上下文中的一段代码,一旦开始执行,就不能被其他线程中断。也就是说,CPU(或JVM)不会运行任何其他线程,直到“原子块”离开。 请注意,这与用lock/mutex/标记的节不同。。。等等,因为只有获得相同锁或互斥锁的其他线程才能中断该部分。但是其他线程仍然可以中断它

编辑,对于评论,如果只影响当前进程的线程,也可以。 重新。多核:我会说,是的,其他核也应该停止,并且我们接受性能影响(或者,如果它仅对当前进程是独占的,那么其他核仍然可以运行其他进程的线程)

背景 首先,很明显,至少在Java中,这个概念:

原子,如不间断:一旦块启动,它就不能被中断,即使是通过任务切换。

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。要么你想保护资源不受读/写操作的影响,然后还有其他同步原语,要么你想增加线程的优先级,然后就这么做。如果你有严格的截止日期,那么不要使用先发制人的多任务系统。使用像实时操作系统这样的多任务协作系统。