gpt4 book ai didi

java - java中的同步是否保护修改后的类字段?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:11 25 4
gpt4 key购买 nike

我在 Java 的同步教程上看到了这个:

public class SynchronizedCounter {
private int c = 0;

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

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

public synchronized int value() {
return c;
}
}

教程说不同线程的后续调用会阻塞,如下所示:
答:增量();
B:增量(); <-- 必须等待 A 完成

...但是说两个线程像这样交错:
A: increment(): 加载 c -> 0;
B: decrement(): 加载 c -> 0;
A: increment(): 递增 c -> 1;
B: decrement(): 递减 c -> -1;
A: increment(): 保存 c -> 1;
B: 递减(): 保存 c -> -1;
最后:c == -1;

根据我对教程的理解,也不必等待;所以 c 是否受到内存不一致的保护?

由于大众需求:the tutorial

最佳答案

(非静态)方法上的 synchronized 关键字导致该方法锁定封闭的对象 - 在本例中为 SynchronizedCounter 的实例。因此,每个同步方法都会阻止其他同步方法在另一个线程中运行。因此,在您的示例中,线程 A 对 increment() 的调用将在线程 B 对 decrement() 的调用开始之前完成。因此你的类是线程安全的。

关于java - java中的同步是否保护修改后的类字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24536131/

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