问题描述
我试图通过在onStartMethod中使用同步Map来避免在Service上执行重复任务,然后检查密钥是否尚未存储。 但是,到目前为止,它仍然无法正常工作,如果我两次足够快地调用一次启动服务,它将执行两次相同的操作。
public void onCreate() {
SYNCED_TABLES = Collections.synchronizedMap(new Hashtable<>());
}
public int onStartCommand(Intent intent, int flags, int startId) {
synchronized (SYNCED_TABLES){
if(!SYNCED_TABLES.containsKey(intent.getStringExtra(KEY))){
SYNCED_TABLES.put(intent.getStringExtra(KEY), true);
/* Do stuff on a Handler thread */
}
else{
Log.d(TAG, "Tried to execute the same task twice " + intent.getStringExtra(KEY));
}
}
}
1楼
SYNCED_TABLES
的初始化不是线程安全的。
因此,您有将多个对象分配给要锁定的该字段的风险,即您拥有多个锁。
将SYNCED_TABLES
声明为final
字段,然后在此处将其初始化:
public class Foo {
final SYNCED_TABLES = Collections.synchronizedMap(new Hashtable<>());
}
这样可以确保您在对象的生命周期内只有一个锁。