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

原子操作和多线程

白灿
2023-03-14
问题内容

最近,我正在阅读一个教程,其中遇到了一条声明:

“Java语言规范保证了读取或写入的变量是一个原子操作(除非该变量的类型的longdouble)类型的操作变量long或者double是只有当它们与申报原子volatile的关键字。”

AtomicIntegerAtomicLong提供类似的方法getAndDecrement()getAndIncrement()并且getAndSet()其是原子的。

我对以上声明感到有些困惑。.请您澄清一下 何时使用 AtomicInteger使用AtomicLong类。


问题答案:

否则a = 28(与a作为一个int)是一个原子操作。但是执行a++操作不是原子操作,因为它需要读取a的值,递增和写入a的结果。结果,如果您曾经a++实现一个线程安全计数器,则可以让两个线程同时读取该值(例如26),然后使它们同时递增和写入,结果是27,而不是28

AtomicInteger通过提供类似于您列出的原子操作来解决此问题。在我的示例中,您将使用incrementAndGet()例如,它可以保证最终值为28而不是27。



 类似资料:
  • 我只是一个非开发人员,所以我的问题可能非常简单! 我只是在测试Java多线程的东西,这不是真正的代码。我想知道如何在 Java 中同时更新两个成员变量,以防我们希望它们都同步。举个例子: 在这种情况下(当然,想象一下多线程),我希望能够保证对< code>items和< code>itemToStatus的任何读取总是返回相同的结果。 因此,如果代码在< code>itemToStatus.put

  • 原子操作是否足够安全,可以在多线程应用程序中使用它,而不会导致竞争条件和其他并发问题?假设我们不担心可见性(我们从CPU读取/写入所有内容)。

  • 主要内容:常用的原子操作命令维护原子性的推荐方法是保留所有相关信息,并将这些信息使用嵌入式文档的形式更新到文档中,这将确保单个文档的所有更新都是原子的。假设我们已经创建了一个名为 productDetails 的集合,并在其中插入了一个文档,如下所示: 在上面的文档中,我们将购买产品的客户的信息嵌入到 product_bought_by 字段中。当有新客户购买该产品时,我们首先会使用 product_available 字段

  • 原子操作 是个不可分割的操作。 在系统的所有线程中,你是不可能观察到原子操作完成了一半这种情况的; 它要么就是做了,要么就是没做,只有这两种可能。 如果从对象读取值的加载操作是 原子 的,而且对这个对象的所有修改操作也是 原子 的, 那么加载操作得到的值要么是对象的初始值,要么是某次修改操作存入的值。 另一方面,非原子操作可能会被另一个线程观察到只完成一半。 如果这个操作是一个存储操作,那么其他线

  • 乐观锁与悲观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换。切换涉及到清空寄存器,缓存数据。然后重新加载新的thread所需数据。当一个线程被挂起时,加入到阻塞队列,在一定的时间或条件下,在通过notify(),notifyAll()唤醒回来。 在某个资源不可用的时候,就将

  • 对于并发操作而言,原子操作是个非常现实的问题。典型的就是i 的问题。 当两个CPU同时对内存中的i进行读取,然后把加一之后的值放入内存中,可能两次i的结果,这个i只增加了一次。 如何保证多CPU对同一块内存的操作是原子的。 golang中sync/atomic就是做这个使用的。 具体的原子操作在不同的操作系统中实现是不同的。比如在Intel的CPU架构机器上,主要是使用总线锁的方式实现的。 大致的