Android中Sqlite数据库多线程并发问题

最近在做一个Android项目, 为了改善用户体验,把原先必须让用户“等待”的过程改成在新线程中异步执行。但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败。

本人对Java并不熟悉,只接触了2个多月(纯粹为了Android项目, 才开始接触JAVA), 在网上搜了一下, 发现JAVA在线程同步方面提供的功能相对于C#真少,只找到synchronized关键字, 而且还不提供timeout机制, 不过经过测试, 至少解决了目前的需求。

问题需求:

1. Android中, 对Sqlite数据库操作, 需要自己实现一个继承自SQLiteOpenHelper的类

2. 实现类中, 对数据库read操作不需要同步(提高效率)

3. 实现类中, 所有对数据库写操作, 必须要同步

解决方法:

定义一个private final static byte[] _writeLock = new byte[0]; 作为写锁

static  保证多个实例之间, 使用的是同一个对象(同一把锁)

final 保证锁对象不会被修改

测试代码:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package com.yushiro;

public class multiThreadTest {

    private final static byte[] _writeLock = new byte[0];

    private static int _syncInt = 0;

    public void Method1(){

        synchronized (_writeLock) {

            StringBuffer sb = new StringBuffer();

            sb.append(Thread.currentThread().getName());

            sb.append(" Method1 ");

            sb.append(_syncInt);

            _syncInt++;

            sb.append(" --> ");

            sb.append(_syncInt);

            System.out.println(sb.toString());

        }

    }

    

    public void Method2(){

        synchronized (_writeLock) {

            StringBuffer sb = new StringBuffer();

            sb.append(Thread.currentThread().getName());

            sb.append(" Method2 ");

            sb.append(_syncInt);

            _syncInt++;

            sb.append(" --> ");

            sb.append(_syncInt);

            System.out.println(sb.toString());      }

    }

    

    public void Method3(){

        synchronized (_writeLock) {

            this.Method1();

            this.Method2();

            }

    }

}

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

package com.yushiro;

public class MainTest {

    

    public static void main(String[] args) {

        

        Thread t2= new Thread1();

        Thread t1= new Thread2();

        Thread t3 = new Thread3();

        t1.start();

        t2.start();

        t3.start();

    }

    private static class Thread2 extends Thread {

        public void run() {

            multiThreadTest tmp = new multiThreadTest();

            while(true) {

                

                

                try {

                    Thread.sleep(30000);

                    tmp.Method1();

                } catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

                

                //System.out.println(y);

            }

        }

    }

    

    private static class Thread1 extends Thread {

        public void run() {

            multiThreadTest tmp = new multiThreadTest();

            while(true) {

                

                

                try {

                    Thread.sleep(100);

                    tmp.Method2();

                    Thread.sleep(100);

                    tmp.Method1();

                } catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

                

                //System.out.println(y);

            }

        }

    }

    private static class Thread3 extends Thread {

        public void run() {

            multiThreadTest tmp = new multiThreadTest();

            while(true) {

                

                

                try {

                    Thread.sleep(100);

                    tmp.Method3();

                } catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

                

                //System.out.println(y);

            }

        }

    }

}

Method3()是为了测试自旋锁

参考:

Java同步机制总结--synchronized(http://leo-faith.iteye.com/blog/177779)

时间: 2024-08-27 12:48:48

Android中Sqlite数据库多线程并发问题的相关文章

android中SQLite数据库的增删改查

1.数据库帮助类PersonSQLiteOpenHelper package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper

Android中SQLite数据库的简单使用

File file = new File("hah.txt"); //只是创建了一个对象file, file指向了hah.txt这个文件,hah.txt这个文件可能存在,也可能不存在.如果文件不存在,则不会被创建. 必须要有文件输出流对文件进行了写的操作,文件才会被创建. 游标:在访问数据库中表结构时,想访问表中的某一行的时候,数据库内部有一个快速的定位方式,这个定位方式是通过索引来实现的.游标相当于数组的指针,通过游标的上下移动来查找数据. 在Android中使用SQLite数据库,

android中sqlite数据库的基本使用和添加多张表

看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大家如何在sqlite数据库中建立多张表. 首先是如何建立数据库和表: 建立一个类继承SQLiteOpenHelper,即: public class ReaderOpenHelper extends SQLiteOpenHelper 然后添加构造方法: public ReaderOpenHelper

Android中SQLite数据库小计

2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for the Enterprise>.学习目标: 学习Android对SQL的支持. 理解在Java中使用SQL——通过SQLiteDatabase类. 创建数据库——SQLiteOpenHelper类. 理解loaders.cursors和adapters. 为了在程序中使用本地的,结构化的数据,需要完成

Android 中 SQLite 数据库的查看

当 SQLite 数据库创建完成后,如何查看数据库的内容呢?如果直接使用 File Explorer 查看,最多只能看到 database 目录下出现了一个 BookStore.db 文件,Book 表是无法通过 File Explorer 看到的. 我将简单介绍两种 SQLite 数据库的查看方式,来对数据库和表的创建情况进行检查. -----------------------------------数据库可视化工具--------------------------------------

android在sqlite数据库的SQLiteOpenHelper中的onUpgrade里判断表是否存在

private boolean tabbleIsExist(String tableName, SQLiteDatabase db) { LogUtils.d("DatabaseHelper", "checking tabbleIsExist " + tableName); boolean result = false; if (tableName == null) { return false; } Cursor cursor = null; try { Stri

Android中SQLite事务的操作

1.创建一个数据库帮助类. package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.

Android实现SQLite数据库的增、删、改、查的操作

核心代码DAO类 package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import

Android学习---SQLite数据库的增删改查和事务(transaction)调用

上一篇文章中介绍了手工拼写sql语句进行数据库的CRUD操作,本文将介绍调用sqlite内置的方法实现CRUD操作,其实质也是通过拼写sql语句. 首先,创建一个新的android项目: 其次,查看代码实现增删查改: 1.创建DB工具类 MyDBHelper.java(创建数据库的操作) package com.amos.android_db; import android.content.Context; import android.database.sqlite.SQLiteDatabas