gpt4 book ai didi

java - 以同步方法等待与 sleep

转载 作者:行者123 更新时间:2023-11-30 08:04:32 24 4
gpt4 key购买 nike

我有一道考试题,由于我不太明白,所以没有得到满分。

问题如下:给定以下程序,应用不允许 sum 打印为负数的更改。

public class Summer {

private int sum;

public void up() {
sum++;
System.out.println(sum);
}

public void down() {
sum--;
System.out.println(sum);
}
}

我所做的更改如下:

public class Summer {

private volatile int sum;

public synchronized void up() {
sum++;
System.out.println(sum);
}

public synchronized void down() {
while (sum <= 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) { }
}
sum--;
System.out.println(sum);
}
}

我得到的答案是我不能在这个程序中使用 sleep ,我必须使用等待,我必须使用函数 notifyAll 来唤醒线程。

我的问题是,为什么我写错了? volatile 不应该不允许 sum 被缓存,因此我总是得到 sum 的更新版本,因为我不可能获得“脏副本”,因此无法打印负数?

最佳答案

Sleep 方法将线程置于 sleep 方法特定时间,而 wait 方法则保持线程执行直到有人唤醒。因此,您的 while 循环将使您的线程陷入无限循环。因此,在 down() 中使用 wait() 而不是 sleep(...) 并在 up 方法中使用 notify 或 notifyAll() 来在它递增时唤醒 down 方法,是的,确实 volatile变量给每个线程一个总是新鲜的值

关于java - 以同步方法等待与 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535154/

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