Android Производительность SharedPreferences - PullRequest
1 голос
/ 26 мая 2020

Недавно я обнаружил, что мои блоки приложения находятся в конфликте монитора при запуске приложения, когда я читаю значения в нескольких потоках. Я обнаружил, что Android SharedPreferencesImpl использует отдельную блокировку для операций чтения и записи. Но почему они не используют более эффективную реализацию с более высокой пропускной способностью, такую ​​как ReentrantReadWriteLock или неблочное чтение, чтобы повысить пропускную способность одновременного чтения?

В новейших SharedPreferencesImpl используется mEditorLock для записи и mLock для чтения:


public String getString(String key, String defValue) {
    synchronized (mLock) {
        ...
    }
}

public Editor putString(String key, String value) {
    synchronized (mEditorLock) {
      ...
    }
}

Почему бы не использовать ReentrantReadWriteLock или CAS для повышения производительности? например:

public String getString(String key, String defValue) {
    readWriteLock.readLock().lock()

    try {
        ...
    } finaly {
        readWriteLock.readLock().unlock()
    }
}

public Editor putString(String key, String value) {
    readWriteLock.writeLock().lock()

    try {
        ...
    } finaly {
        readWriteLock.writeLock().unlock()
    }
}

Новейший исходный код SharedPreferencesImpl

...