Недавно я обнаружил, что мои блоки приложения находятся в конфликте монитора при запуске приложения, когда я читаю значения в нескольких потоках. Я обнаружил, что 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