我有一个传递给函数的对象,该函数将延迟的runnable传递给处理程序。
我可以在传入对象时锁定对象,并在使用锁定对象更改对象时,然后对象需要传递给“外来”方法上传。
如何确保此异类方法上传不会破坏我对象的线程安全?
它有从其他地方传入的对象,而不仅仅是这个延迟线程,所以对象锁无效,它包含了很多功能,所以我担心用锁对象锁定整个调用。
private ContentValues mEvent;
protected final Object mEventLock = new Object();
public void delayFunction(final Values e) {
// Sanity check
if (e == null) {
return;
}
synchronized (mEventLock) {
mEvent = e;
}
this.handler.postDelayed(new Runnable() {
@Override
public void run() {
if (prefs != null) {
final String refs = prefs.getPrefs();
if (refs != null && refs != "") {
log.d("refs field: '%s'", refs);
synchronized (mEventLock) {
mEvent.remove(refs);
mEvent.put(refs, 1);
}
}
}
synchronized (mEventLock) {
// Upload event.
upload(mEvent);
}
}
}, INSTALL_DELAY);
}
答案 0 :(得分:0)
我不确定我是否理解您在代码中要实现的目标:
delayFunction
首先将e
分配给mEvent
为什么不简单地制作e
的本地副本并在没有同步的情况下处理该副本?
此外,mEvent
可以被mEvent = e
和runnable执行之间的另一个线程修改,因为你退出synchronized块:你的runnable将在另一个e
上工作,你将拥有错过了上传。
但也许这是故意的。