onStartCommand服务中的同步映射

时间:2017-02-15 18:59:37

标签: android race-condition synchronized

我试图通过在onStartMethod中使用同步Map来避免在服务上执行重复任务,然后检查是否尚未存储密钥。但是,到目前为止还没有工作,如果我打电话很快就启动服务两次就会执行两次相同的事情。

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 个答案:

答案 0 :(得分:0)

SYNCED_TABLES的初始化不是线程安全的。因此,您可能会将多个对象分配给您锁定的此字段,即您有多个锁。

SYNCED_TABLES声明为final字段并在其中初始化:

public class Foo {
    final SYNCED_TABLES = Collections.synchronizedMap(new Hashtable<>());
}

这可以保证在对象的生命周期内只有一次锁定。