java本机方法调用是原子调用吗?

java本机方法调用是原子调用吗?,java,multithreading,concurrency,native,Java,Multithreading,Concurrency,Native,我需要某种操作是原子的 这里的“原子”意味着“一旦该方法开始执行,它不应该被中断,直到它完成,甚至线程调度程序也不应该使该线程在其处于运行状态时变为可运行状态” 所有方法都是本机方法,多个线程同时运行以执行这些方法 第一个问题:本机方法执行本质上是原子的吗 第二个问题:为了实现原子性,我们可以使用java concurent/lock API吗?如果可以,请尽可能提供任何示例/链接 谢谢。您对原子的定义是非标准的。这是一个更大的挑战 本机方法是原子的吗(根据您的非标准定义)?因为我可以在本机方法

我需要某种操作是原子的

这里的“原子”意味着“一旦该方法开始执行,它不应该被中断,直到它完成,甚至线程调度程序也不应该使该线程在其处于运行状态时变为可运行状态”

所有方法都是本机方法,多个线程同时运行以执行这些方法

第一个问题:本机方法执行本质上是原子的吗

第二个问题:为了实现原子性,我们可以使用java concurent/lock API吗?如果可以,请尽可能提供任何示例/链接


谢谢。

您对原子的定义是非标准的。这是一个更大的挑战

  • 本机方法是原子的吗(根据您的非标准定义)?因为我可以在本机方法运行期间的任何时候,拔掉电源线并中断执行,所以我要说本机方法是无可救药的非原子方法
  • 我们可以使用java并发锁API在本机方法中实现原子性(非标准)吗?如前所述,本机方法是无可救药的非原子方法。什么也帮不了你

  • 要防止中断,必须使用机器代码指令cli和sti来禁用和启用中断(在x86/x64上)。它甚至不能用普通的C语言实现


    这是如此低的水平,因为它很少做。主要是因为它很少有用。主要关注点通常是与其他线程的交互行为,这就是为什么大多数用例都是以这种方式定义原子的,而不是中断方面的原子。

    如果我正确理解这个问题,您会问:我是否有可能实现某个线程始终在CPU上运行,直到它完成?为了清楚起见,在此期间不应使用另一个螺纹替换

    答案是:即使是(我不认为是),这也与原子性无关。因为如果您有多个CPU,多个线程仍然可以访问和更改相同的数据,而所有线程都在同一时间不间断地运行。因此,即使使用“原子性”的定义,您仍然会遇到并发问题


    如果您只是想要传统意义上的线程安全,那么是的,您可以使用java锁等来实现这一点,即使您调用本机方法。请参阅本机方法内的java线程同步示例。

    感谢您的回复,根据您的回答,我的理解是,我们无法实现java本机方法和普通成员方法执行的原子性,因为其级别太低,对吧?。如果可能的话,你可以详细说明一下,请分享一些有用的链接。请再次阅读我的答案。你不明白答案的事实向我表明你不明白你在要求什么。只有在非常具体和非常技术性的情况下才需要它,如果您还不知道如何在
    C
    中使用
    asm
    ,我会怀疑您是否真的需要它。原子的定义有点不正确。这不是关于中断,而是关于一致的数据。对于中断或并行操作,您无能为力——特别是在多处理器上——但是您可以做很多事情来同步操作并保证数据的一致性。你能编辑你的问题来解释你为什么要阻止打断吗?