onStartCommand 服务中的同步地图

Synchronised Map in onStartCommand Service

我试图通过在 onStartMethod 中使用同步映射来避免在服务上执行重复任务,然后检查是否尚未存储密钥。但是,到目前为止还没有用,如果我足够快地调用启动服务两次,它就会执行同样的事情两次。

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));
                }
            }

}

SYNCED_TABLES 的初始化不是线程安全的。因此,您冒着将多个对象分配给您锁定的该字段的风险,即您有多个锁。

SYNCED_TABLES 声明为 final 字段并在此处对其进行初始化:

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

这保证了您在对象的整个生命周期内只有一个锁。