Java 滥用同步?
我正在尝试为Android应用程序同步两段代码 第一个块使用AsyncFacebookRunner请求用户的兴趣(如果有) 如果找到了兴趣,则该用户的成员变量将填充来自Facebook JSON响应的兴趣 第二个代码块通过查看成员变量来检查用户是否真正感兴趣。如果有兴趣,则执行多行代码Java 滥用同步?,java,android,multithreading,facebook-graph-api,synchronized,Java,Android,Multithreading,Facebook Graph Api,Synchronized,我正在尝试为Android应用程序同步两段代码 第一个块使用AsyncFacebookRunner请求用户的兴趣(如果有) 如果找到了兴趣,则该用户的成员变量将填充来自Facebook JSON响应的兴趣 第二个代码块通过查看成员变量来检查用户是否真正感兴趣。如果有兴趣,则执行多行代码 synchronized(this) { if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().l
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();
}
}
我希望第二个块在执行之前等待friend.requestInterests()完成
EDIT:我最终重组了代码,以利用运行者的onComplete方法。这一切都发生在我修改程序结构,不得不改变一切的时候。谢谢大家的帮助。
我希望第二个块在执行之前等待friend.requestInterests()完成
JVM确保这两个块不会在同一个实例中同时执行
如果您还想确保第二个块仅在第一个块运行之后运行,则可以使用状态变量和wait
/notify
调用来执行此操作。但是更好的方法是使用一个同步类,比如;e、 g
事实上,如果这些是访问和更新相关对象状态的唯一位置,那么您应该能够省去synchronized
块。对倒计时
和等待
的调用将提供必要的“先到先到”关系,以确保正确的同步
然而,@pst的评论提出了一个观点,即使用代码使用的Facebook库框架的API可能有更好的方法来实现这一点。AysncFacebookRunner应该支持回调。使用这些(如果没有,就找一个更好的库?:-)。然后,这只是对“完成”事件做出反应的问题,就像正常的按钮点击或诸如此类的事情一样。根据具体细节(例如,调度在哪个线程上),可能仍然需要
同步。然而,这是一个可怕的误用,甚至可能没有达到预期的效果。考虑其他的“原语”,如“非作用域”资源控制的MutExs或信号量。(另外,请参阅Futures等)这是事实。但是,我更愿意在不使用回调的情况下执行此操作。为了利用onComplete,我必须大量修改代码的结构。
private CountDownLatch latch = new CountDownLatch(1);
...
synchronized(this) {
// do first actions
}
this.latch.countdown();
....
this.latch.await();
synchronized(this) {
// do second
}