gpt4 book ai didi

java - 同步块(synchronized block)中的原子变量

转载 作者:行者123 更新时间:2023-12-02 02:07:59 26 4
gpt4 key购买 nike

我指的是 Java 语言,但我认为它也可以涉及其他语言。

问题是:将原子变量放在同步块(synchronized block)中有意义吗?或者同步块(synchronized block)不会同时被两个线程执行这一事实就足以保证同步块(synchronized block)中执行的操作是原子的吗? (示例 1 与示例 2)

示例1:

public class SharedVariables {
public static AtomicInteger i;
}

public class MyThread extends Thread {
public void run() {
synchronized(SharedVariables.i) {
i.getAndIncrement();
}
}
}

示例2:

public class MyIntegerWrapper {
public int i;
public void increment() {
this.i++;
}
}

public class SharedVariables {
public static MyIntegerWrapper i;
}

public class MyThread extends Thread {
public void run() {
synchronized(SharedVariables.i) {
i.increment();
}
}
}

最佳答案

本身就不是。但如果您正在执行的操作涉及线程安全类(如 AtomicInteger)和其他变量(即使它们是其他 AtomicInteger),您可能需要这样做。

AtomicInteger 保证对其进行的操作是线程安全的和原子的,而无需您执行任何操作。但假设您递增一个并递减另一个,并且它们的总和始终需要相同。您有 2 个原子操作,但要将它们组合成一个原子操作,您将需要额外的同步。只有这样,您才能确定其他线程将读取这些变量的常量总和。

在将手动同步与 java.util.concurrent 类结合使用时,我仍然要小心,因为并发类很可能提供更清晰的解决方案。

关于java - 同步块(synchronized block)中的原子变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50463213/

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