gpt4 book ai didi

java - 误用同步?

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

我正在尝试同步 Android 应用程序的两个代码块。

第一个 block 使用 AsyncFacebookRunner 来请求用户的兴趣(如果有)。

如果找到兴趣,则该用户的成员变量将使用来自 Facebook JSON 响应的兴趣进行填充。

第二个代码块通过查看该成员变量来检查用户是否确实感兴趣。如果有兴趣,则会执行几行额外的代码。

synchronized(this)
{
if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().length() == 0) )
friend.requestInterests(mFacebook); // Get that friend's Facebook activities and interests.
}

synchronized(this)
{
if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().length() == 0) )
{
final AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
alertDialog.setTitle("Sorry...");
alertDialog.setMessage("Your friend isn't sharing their interests.");
alertDialog.setButton("Go Back", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
}
});

alertDialog.show();
}
}

我希望第二个 block 等到friend.requestInterests()完成后再执行。

编辑:我最终重组了我的代码以利用运行程序的 onComplete 方法。当我修改程序的结构并且必须更改所有内容时,这一切都发生了。感谢大家的帮助。

最佳答案

I want the second block to wait until friend.requestInterests() is complete before executing.

JVM 确保对于 this 的同一个实例,两个 block 不会同时执行。

如果您另外想要确保第二个 block 仅在第一个 block 运行之后运行,那么您可以使用状态变量和 wait/notify 调用。但更好的方法是使用同步类之一,例如 CountDownLatch ;例如

private CountDownLatch latch = new CountDownLatch(1);

...

synchronized(this) {
// do first actions
}
this.latch.countdown();

....

this.latch.await();
synchronized(this) {
// do second
}

事实上,如果这些是访问和更新相关对象状态的唯一位置,那么您应该能够省略 synchronized block 。对 countdownawait 的调用将提供必要的“先于”关系,以确保正确的同步。

<小时/>

但是,@pst 的评论提出了这样一个观点:使用您的代码所使用的 Facebook 库框架的 API 可能有更好的方法来实现此目的。

关于java - 误用同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051768/

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