gpt4 book ai didi

java - 如何保证AtomicLong addAndGet结果的正确性

转载 作者:行者123 更新时间:2023-11-30 02:09:03 29 4
gpt4 key购买 nike

我想计算我的多线程下载程序中的当前百分比。但是有一个奇怪的问题。第二次下载时的lastDownloadSize必须是lastDown的write和lastDownloadSize之和。 example

这是我的代码

private long getDownloadSize() {
synchronized (this) {
final AtomicLong totalWriteCount = new AtomicLong(0);
final AtomicLong lastDownloadSize = new AtomicLong(0);
for (DownloadTask task : downloadTasks) {
final long writeCount = task.getWriteCount();
totalWriteCount.addAndGet(writeCount);
final long downloadSize = task.getPosition().getDownloadSize();
lastDownloadSize.addAndGet(downloadSize);
}
System.out.println("===== writeCount : " + totalWriteCount + "lastDownloadSize : " + lastDownloadSize);
return totalWriteCount.addAndGet(lastDownloadSize.get());
}
}

最佳答案

您的 totalWriteCountlastDownloadSize 变量是 getDownloadSize() 方法的局部变量。在这种情况下,使用 AtomicLong 没有意义,因为只有单个线程可以访问它们。

您的意思可能是让 totalWriteCountlastDownloadSize 成为您的类的成员:

class SomeClass {
// ...
final AtomicLong totalWriteCount = new AtomicLong(0);
final AtomicLong lastDownloadSize = new AtomicLong(0);
// ...

private long getDownloadSize() {
synchronized (this) {
for (DownloadTask task : downloadTasks) {
final long writeCount = task.getWriteCount();
totalWriteCount.addAndGet(writeCount);
final long downloadSize = task.getPosition().getDownloadSize();
lastDownloadSize.addAndGet(downloadSize);
}
System.out.println("===== writeCount : " + totalWriteCount + "lastDownloadSize : " + lastDownloadSize);
return totalWriteCount.addAndGet(lastDownloadSize.get());
}
}
}

但是,同样在这种情况下,如果仅从 synchronized(this) block 内访问它们,则不需要使用 AtomicLong,因为同步块(synchronized block)已经确保它们只能同时由单个线程访问。

关于java - 如何保证AtomicLong addAndGet结果的正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50637384/

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