gpt4 book ai didi

java - 互斥与原子变量

转载 作者:行者123 更新时间:2023-11-29 04:23:38 25 4
gpt4 key购买 nike

原子操作 - 有效地同时发生或根本不发生的 Action 例如:java.util.concurrent.atomic.AtomicInteger

互斥 - 防止同时访问共享资源 Ex: synchronized


使用互斥方法,SynchronizedCounter 是线程安全的,

class SynchronizedCounter {
private int c = 0;

public synchronized void increment() {
c++;
}

public synchronized void decrement() {
c--;
}

public synchronized int value() {
return c;
}

}

使用原子变量方法,AtomicCounter 是线程安全的,

import java.util.concurrent.atomic.AtomicInteger;

class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);

public void increment() {
c.incrementAndGet();
}

public void decrement() {
c.decrementAndGet();
}

public int value() {
return c.get();
}
}

1) 在上面的代码中,为什么原子变量方法比互斥方法更好?

2) 一般来说,互斥的目标和原子变量的方法不一样吗?

最佳答案

在您的示例中,两个类都提供“功能上”等效的结果,主要区别在于性能。如果您只需要一个简单的计数器,则原子更合适,因为互斥通常会更昂贵。这样做的原因是原子操作由单个 CPU 指令执行,其中互斥需要通常由操作系统处理的更昂贵的高级操作。

互斥允许跨多个变量协调变化。要扩展您的示例,请想象一个更新两个(或更多)计数器的系统。计数器初始化如下;

  • a = 0
  • b = 1

在下表中,每一行代表一个将导致所需状态的事务。每列都是时间的流逝(例如 CPU 周期)。

该系统的正确性定义如下;

  1. 允许过时的读取(例如,完整的先前事务)。
  2. 部分读取无效(例如,两个或多个事务的混合 View )。

enter image description here

粗黑线表示可以读取值的同步时间点。使用 Atomics 可以按照演示的顺序执行,这是不受欢迎的。互斥通过阻止或提供过时读取来权衡性能以换取正确性。

为了阐明为什么“正确性”很重要,假设“a”是净收入,“b”是总收入。与提供不相符的值相比,通常更愿意报告过去的事情或说“一瞬间”。

关于java - 互斥与原子变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com