gpt4 book ai didi

java - 为什么我遇到同步问题?

转载 作者:行者123 更新时间:2023-12-01 16:47:24 24 4
gpt4 key购买 nike

为什么名为“count”的变量最终不等于 20000?

public class Main {
private Integer count = 0;

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

public static void main(String[] args) {
Main app = new Main();
app.doWork();
}

public void doWork() {

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i=0; i<10000; i++) {
increment();
}
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i=0; i<10000; i++) {
increment();
}
}
});

t1.start();
t2.start();
System.out.println(count);
}

看起来线程丢失了变量,但是什么时候发生的?使用 AtomicInteger 时也会发生同样的情况。

附注您能否推荐一门带有练习的好类(class)来学习 Java 多线程?)

最佳答案

因为 start 创建了一个新线程,当您打印计数时,您不确定线程​​执行是否已完成。

t1.start();
t2.start();

System.out.println(count); // Here you don't know if t1 and t2 ended their execution

加入线程以等待它们完成任务:

t1.start();
t2.start();

t1.join(); // wait for t1 to finish
t2.join(); // wait for t2 to finish

System.out.println(count); // 20000

注意:您必须在 join 调用上处理 InterruptedException

关于java - 为什么我遇到同步问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47551863/

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