最近在做一个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) {
e.printStackTrace();
}
}
}
}
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) {
e.printStackTrace();
}
}
}
}
private static class Thread3
extends Thread
{
public void run()
{
multiThreadTest
tmp = new multiThreadTest();
while ( true )
{
try {
Thread.sleep( 100 );
tmp.Method3();
}
catch (InterruptedException
e) {
e.printStackTrace();
}
}
}
}
}
|
Method3()是为了测试自旋锁
参考:
分享到:
相关推荐
SQLite是一个进程内的库,...SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。 SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。 SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
资源名称:android中sqlite数据库的创建以及增删改查 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
Android Studio SQLite数据库使用
Android之Sqlite数据库操作实例
Android使用SQLite数据库进行增删改查详细案例...
Android 数据库SQLite 详解,简单学好SQLite
sqlite数据库,用c++封装类,以及源码实现的对sqlite数据库封装类的操作。同时有boost多线程对sqlite数据库进行操作。 真是学习居家的好例子。。。。
一个android读取sqlite数据库的数据并用listview显示demo,如有问题及时提醒。
该代码实现了android的sqlite数据库的加密和解密
使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java...
Android 开发中使用 SQLite 数据库 简介: SQLite 是一款非常流行的嵌入式数据库,它支持 SQL 查询,并且只用很少的内存。Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。...
android对sqlite数据库的操作
如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.database.sqlite.SQLiteException: database is locked这样的异常。对于这样的问题,解决的办法就是keep single ...
android中SQLite数据库中用insert同时插入多条记录的方法和效率比较
总结了一下Qt中sqlite多线程操作遇到的几个问题,希望能对有需要的朋友一点帮助
Android 操作 SQLite数据库 Android 操作 SQLite数据库 Android 操作 SQLite数据库
前情提要:Android 数据库(SQLite) 【简介、创建、使用(增删改查、事务、实战演练)、数据显示控件(ListView、Adapter、实战演练)】 https://blog.csdn.net/weixin_44949135/article/details/105955663 Android ...
android studio SQLite数据库的创建、增删改查操作 SharedPreferences存储数据的方法 掌握文
Android实验报告Sqlite数据库操作.pdf
Android 操作 sqlite 数据库增加修改删除 Android 操作 sqlite 数据库增加修改删除 Android 操作 sqlite 数据库增加修改删除