当前位置: 首页 > 面试题库 >

编程中的“原子”是什么意思?

芮承运
2023-03-14
问题内容

在有效的Java书中,它指出:

语言规范保证,除非变量的类型long或类型为double[JLS,17.4.7],否则读写变量是原子的。

在Java编程或一般编程中,“原子”是什么意思?


问题答案:

这是一个示例,因为一个示例通常比冗长的解释更清晰。假设foo是类型为的变量long。以下操作不是原子操作:

foo = 65465498L;

实际上,变量是使用两个单独的操作写入的:一个操作写入前32位,第二个操作写入后32位。这意味着另一个线程可能读取的值foo,并看到中间状态。

使操作成为原子操作包括使用同步机制,以确保从任何其他线程将操作视为单个原子操作(即不可拆分的部分)。这意味着,一旦使该操作成为原子操作,任何其他线程将foo在赋值之前或赋值之后看到的值。但绝不是中间值。

一种简单的方法是使变量volatile:

private volatile long foo;

或同步对变量的每次访问:

public synchronized void setFoo(long value) {
    this.foo = value;
}

public synchronized long getFoo() {
    return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized

或将其替换为AtomicLong

private AtomicLong foo;


 类似资料:
  • 在有效Java书中,它指出: 语言规范保证,除非变量类型为或[JLS,17.4.7],否则读取或写入变量是原子的。 在Java编程或一般编程的背景下,“原子”是什么意思?

  • 问题内容: 我已经看过几次了,但我不清楚它的含义。您何时以及为什么要这样做? 我知道接口的作用,但是我不清楚这一点,这让我觉得我错过了正确使用它们的机会。 如果要这样做,是否只是这样: 您可以使用任何实现的类吗?您什么时候需要这样做?我唯一能想到的是,如果您有一个方法并且不确定要实现的对象将传递什么对象。我想不出您需要多久这样做一次。 另外,如何编写一个方法来接受实现接口的对象?那可能吗? 问题答

  • 问题内容: 我在github上找到了一些用Swift编写的代码, 并对这条线有些困惑 您能解释一下这条线的真正含义吗?非常感谢你! 问题答案: 意思是不要给那东西起名字。它可以在许多地方使用。就您而言,这就是说忽略传递给闭包的变量。您提供的代码将忽略所有参数,但您也可以忽略某些参数。 是执行关闭的开始。在您的示例代码中,闭包的实现为空。 总体而言,该行定义了一个名为“ done”的闭包,该闭包接受

  • 这点我见过提过几次,但我不清楚是甚么意思。你什么时候为什么要这么做? 我知道接口是做什么的,但我不清楚这一点的事实使我认为我错过了正确使用它们。 如果你要做: 您可以使用任何实现的类?你什么时候需要这么做?我唯一能想到的是,如果您有一个方法,但您不确定会传递什么对象,除了它实现。我想不出你需要多长时间这样做一次。 另外,如何编写一个方法来接受一个实现接口的对象呢?有可能吗?

  • 我在函数式编程和PLT圈子里听过“余代数”这个术语好几次,尤其是当讨论对象、副词、透镜等等的时候。谷歌这个术语给出的页面给出了这些结构的数学描述,这对我来说是很难理解的。谁能解释一下在编程环境中余代数的含义,它们的意义是什么,以及它们与对象和共轭子的关系?

  • 我有一个使用activeMQ消息的项目。它运行良好,但有时会遇到挂起的消息卡在队列中。它说1000入队,0出队,1000分派。它还说1000条待处理的消息。 “待定消息”的可能原因是什么?