gpt4 book ai didi

Java延迟返回值

转载 作者:行者123 更新时间:2023-11-29 07:24:40 28 4
gpt4 key购买 nike

我有一种情况,我从 YAML 文件中读取数据,该文件对应用程序很重要,因为它在多个类中使用。这是我的代码:

public class CredentialsReader {
private UserCredentials credentials;
private boolean isReading = false;


public CredentialsReader() {
}

public void readCredentials() {
Runnable readerTask = new Runnable() {
@Override
public void run() {
isReading = true;
parseCredentials();
isReading = false;
System.err.println("Parsed credentials");
}
};
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
service.scheduleAtFixedRate(readerTask, 0, 60, TimeUnit.SECONDS);

}

private void parseCredentials() {
final File f = new File("/home/dev/IdeaProjects/server/src/main/resources/credentials.yaml");
try {
UserCredentials userCredentials = new ObjectMapper().readValue(f, UserCredentials.class);
this.credentials = userCredentials;
System.out.println(this.credentials.getUsername() + ", " + this.credentials.getPassword());
} catch (IOException e) {
e.printStackTrace();
}
}
public UserCredentials getCredentials() { return this.credentials; }


}

如您所见,我每分钟读取一次数据,我的问题是:
我可以延迟 getCredentials 的返回值吗,所以当调用该方法时,我检查 isReading 是否为 true 然后延迟返回,这样我可以保证调用者将始终获得yaml 文件的实际状态?

最佳答案

我认为对于类似的情况有合适的锁,但这似乎是同步的就足够了。

synchronized private void parseCredentials() {...}
synchronized public UserCredentials getCredentials() { ... }

通过声明那些同步的方法,一次只有一个线程能够进入该方法,本质上是一种障碍。这意味着 parseCredentials 可能必须等待 getCredentials,但 getCredentials 的速度非常快,您永远不会注意到。

这将在 CredentialReader 的一个实例上进行同步,因此如果您使用多个实例,您可能希望在其他对象上进行同步。如前所述,注释最好在私有(private)对象而不是实例本身上同步。这是一个小改动:

public class CredentialsReader {
private UserCredentials credentials;
private boolean isReading = false;
final private Object lock = new Object();
...

然后从方法签名中删除同步并在主体中添加同步调用。

private void parseCredentials() {
synchronize(lock){
//original code goes here.
}
}

此外,isReading 应该是可变的。

关于Java延迟返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56233150/

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