多线程Java同步将对象传递到外部方法
我将一个对象传递给一个函数,该函数将一个延迟的runnable传递给一个处理程序
我可以在对象传入和使用lock对象更改时锁定该对象,但随后该对象需要传递到“alien”方法
如何确保此外来方法上载不会破坏对象的线程安全
它有从别处传入的对象,不仅仅是这个延迟线程,所以对象锁无效,它包含了很多功能,所以我关心的是用锁对象锁定整个调用
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);
}
# 1 楼答案
我不确定我是否理解您试图在代码中实现的目标:
delayFunction
首先将e
分配给mEvent
为什么不直接制作
e
的本地副本并在不进行同步的情况下处理该副本呢另外,
mEvent
可能会被mEvent = e
和可运行执行之间的另一个线程修改,因为您退出了同步块:您的可运行程序将在另一个e
上工作,并且您将错过上载但也许这是故意的