Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLiteDatabase线程安全吗?_Android_Multithreading_Sqlite - Fatal编程技术网

Android SQLiteDatabase线程安全吗?

Android SQLiteDatabase线程安全吗?,android,multithreading,sqlite,Android,Multithreading,Sqlite,很多人说SQLiteDatabase是线程安全的,但是,当我使用如下设置运行一些简单的测试时: private class MyRunnable implements Runnable{ @Override public void run() { for(int i = 0 ;i < 100 ; i++){ try { Thread.sleep(100); } catch (I

很多人说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实现Runnable{
@凌驾
公开募捐{
对于(int i=0;i<100;i++){
试一试{
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
Cursor Cursor=database.query(true,“testdb”,新字符串[]{“num”},“id=?”,
新字符串[]{“1”},null,null,null,null);
cursor.moveToFirst();
int original=cursor.getInt(0);
ContentValues=新的ContentValues();
值。put(“num”++原始值);
update(“testdb”,值,“id=?”,新字符串[]{“1”});
}
}
}
MyRunnable runnable1=新的MyRunnable();
MyRunnable runnable2=新的MyRunnable();
新线程(runnable1.start();
新线程(runnable2.start();
在MyRunnable中,有一个循环运行100次。每次,num字段将加1,num的初始值为0。我们可以看到上面代码的预期结果是200,但我只得到197


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

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

UPDATE table SET num = num + 1
与其在应用程序代码中检索数据,不如修改数据并将其存储回去


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

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

UPDATE table SET num = num + 1
与其在应用程序代码中检索数据,不如修改数据并将其存储回去


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

请提及事务。请提及事务。