-
Notifications
You must be signed in to change notification settings - Fork 779
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-03-28:SharedPreferences 是线程安全的吗?它的 commit 和 apply 方法有什么区别? #15
Comments
context.getSharedPreferences()开始追踪的话,可以去到ContextImpl的getSharedPreferences(),最终发现SharedPreferencesImpl这个SharedPreferences的实现类,在代码中可以看到读写操作时都有大量的synchronized,因此它是线程安全的 |
commit是同步写入,会返回执行结果,apply方法是异步写入,并不会返回执行结果;但是SharedPreferences文件的写入是全量写入,即使只是修改了其中一条key-value,也会执行全部的写入操作,因为SharedPreferences只能用于存储体积较小的数据,太大了就容易引发OOM,同时如果需要修改多条数据,必须使用Editor来一次性完成修改再提交 |
SharedPreferences 是线程安全的 进程不安全的, commit 是同步写入,apply是异步写入。 |
SharedPreferences 是线程安全的 进程不安全的, commit 是同步写入有返回值,apply是异步写入。 |
由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要用commit的。 |
SP 是线程安全,非进程安全。commit 和 apply 的方法里面都一个 commitToMemory 方法,即把更新同步到内容。至于落地磁盘,commit 也并非完全同步,如果 commit 前有 apply 还未落盘,commit 会异步等待 apply 落盘之后在执行,内部通过一个计数器来判断。 |
1.SharePreferences是线程安全的 里面的方法有大量的synchronized来保障。 |
1.SharePreferences是线程安全的 里面的方法有大量的synchronized来保障。 }
这样好处,跟坏,你是怎么认为,你觉的会怎么样? |
楼上都说的很清楚了,这里补充一个问题, SharedPreferences优化建议:
|
全量写入:无论是commit还是apply都是全量写入,所以最好一次性操作完数据再提交 |
SharedPreferences是线程安全的 进程不安全 用于存储体积小的数据 apply异步提交先提交到内存 而后在异步提交到硬盘 commit是同步提交到硬盘并返回结果 |
SharedPreferences为什么是进程不安全? 2) 我们有两个办法能保证进程安全: 使用跨进程组件,也就是ContentProvider,这也是官方推荐的做法。通过ContentProvider对多进程进行了处理,使得不同进程都是通过ContentProvider访问SharedPreferences。 |
No description provided.
The text was updated successfully, but these errors were encountered: