gpt4 book ai didi

android - Android SQLiteDatabase 线程安全吗?

转载 作者:行者123 更新时间:2023-11-29 15:43:45 26 4
gpt4 key购买 nike

很多人说 SQLiteDatabase 是线程安全的,但是,当我用这样的设置运行一些简单的测试时:

private class MyRunnable implements Runnable{

@Override
public void run() {
for(int i = 0 ;i < 100 ; i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

Cursor cursor = database.query(true,"testdb",new String[]{"num"},"id=?",
new String[]{"1"},null,null,null,null);
cursor.moveToFirst();
int original = cursor.getInt(0);
ContentValues values = new ContentValues();
values.put("num",++original);
database.update("testdb",values,"id=?",new String[]{"1"});
}
}
}

MyRunnable runnable1 = new MyRunnable();
MyRunnable runnable2 = new MyRunnable();

new Thread(runnable1).start();
new Thread(runnable2).start();

在 MyRunnable 中,有一个运行 100 次的循环。每次num字段都会加1,num的初始值为0。可以看到上面代码的预期结果是200,但是我只得到了197。

那么这是否意味着 SQLiteDatabase 不是线程安全的?

最佳答案

不,您处理数据的方式不是线程安全的。您可以使用像这样的原子 SQL 查询:

UPDATE table SET num = num + 1

不是在您的应用程序代码中检索数据,而是修改它并将其存储回去。

SQLite 是线程安全的意味着您可以同时在多个线程中安全地使用所有 SQLite 函数,这并不意味着数据库会根据您的操作自动锁定。如果您的线程在 query() 调用和 update() 调用之间的任何地方被中断,此时返回线程将意味着您之前检索的数据不再是最新的。

关于android - Android SQLiteDatabase 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com