【发布时间】:2012-05-09 17:28:46
【问题描述】:
我有一个对象传递给一个函数,该函数将一个延迟的可运行对象传递给一个处理程序。
我可以在对象被传入和更改时使用锁定对象锁定对象,但随后需要将对象传递给“外星人”方法上传。
如何确保这种外来方法上传不会破坏我的对象的线程安全?
它有从其他地方传入的对象,而不仅仅是这个延迟线程,所以对象锁无效,它包含很多功能,所以我担心用锁对象锁定整个调用。
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);
}
【问题讨论】:
-
看起来在简化发布代码时,您犯了一些错误。这些错误使您很难猜测您的实际代码在做什么。
-
“外来方法上传不会破坏我的对象的线程安全”是什么意思?你担心比赛条件吗?能见度问题?
-
抱歉调整了代码。我担心将对象传递给外部函数,如果我不锁定上传(),延迟函数会再次被调用并更改对象,但是锁定所有上传()调用并一直锁定它似乎很激烈.
-
这是整个班级还是有其他方法/成员?如果有,发布完整代码是有意义的(除非它真的很长且不相关,但任何使用 mEvent 都是相关的)。
-
还有其他方法,上传方法我们是公开的,可以从这个类之外获取对象。
标签: java multithreading synchronization locking synchronized