java sqlite 多线程并发_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 保证锁对象不会被修改
测试代码:
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();
}
}
}
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 sqlite 多线程并发_Android中Sqlite数据库多线程并发问题相关推荐
- java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
java项目中如何利用多线程实现一个定时器任务 发布时间:2020-11-10 16:04:03 来源:亿速云 阅读:86 作者:Leah 今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时 ...
- python访问数据库如何解决高并发_怎样解决数据库高并发的问题
怎样解决数据库高并发的问题?解决数据库高并发使用缓存式的Web应用程序架构.增加Redis缓存数据库.增加数据库索引.页面静态化.使用存储过程.MySQL主从读写分离.分表分库.负载均衡集群. 解决数 ...
- android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术
本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术.初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习.下面是个人的总结 拉勾IT课小编为大 ...
- java handler使用方法_Android中Handler的使用方法及实例(基础回顾)
Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中. 本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s ...
- java mysql 回滚_Java 中对数据库操作时的 回滚
Connection conn=null; conn.rollback()就可以回滚 //用jdbc连接数据库 //举例子,比如你在写一个级联删除的方法的时候,为了保证数据完整性,删除的时候一定要确定 ...
- java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令
这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习 android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析 ...
- java 登录qq空间_Android中集成QQ登陆和QQ空间分享
本文基于QQ open sdk V2.4.1. QQ登录应用有一个地方是需要注意的, QQ申请同一品牌应用(包括网站和app),需要相互依赖申请,因为在QQ互联中,一个应用对应一个app key,如果 ...
- java%3e%3e=符号_android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值...
在项目中,有时候在一些控件(如Button.TextView)中要添加一些符号,如下图所示: 这个时候可以使用图片的方式来显示,不过这些可以直接使用Unicode码就直接显示出来了. 4个箭头图标的代 ...
- java手机电池充电代码_Android中获取电池电量实例代码
/** * * @author chrp * *显示当前电池电量 */ public class MainActivity extends Activity { private TextView tv ...
最新文章
- 如何为你的博客文章自动添加版权信息?
- C#基于Socket的CS模式的完整例子
- Java调用WeChat's API总结
- 如何解锁excel表格保护_Excel表格技巧—如何计算矩阵相乘
- c语言十进制小数转其他进制,只写出了十进制小数转换成二进制的,求二进制小数转十进制的...
- jsp入门配置Tomcat
- IE浏览器打不开网页有什么解决的方法
- InfiniBand -- 无限带宽技术(简称IB) 基于 Ubuntu 16.04 安装 IB 驱动
- Python常用模块 之 hashlib模块
- React的调和过程(Reconcilliation)
- 用命令如何返回上级目录
- LTE-5G学习笔记17--COMP技术讲解
- 基于rfid的毕业设计题目50例
- python wgs84坐标转换_python WGS84和ECEF坐标的转换
- Hadoop系统中的单点故障解决方案总结
- 转:用迅雷下载Android SDK全系列
- CCF论文列表(2022拟定)大更新!NAACL升B!ICLR继续陪跑...MICCAI空降B!PRCV空降C!
- ppt在线快速转换成pdf的方法
- 条码打印软件如何使用Excel表批量打印条码标签
- 安防视频流媒体服务器Easy NVR搭建之DASH直播平台的搭建需要具备哪些条件?
热门文章
- Linux系统C语言实现 根据进程号/进程名获取进程的运行时间
- Linux内核:一文读懂文件系统、缓冲区高速缓存和块设备、超级块
- BeyondCompare3提示许可密钥过期完美解决方法:3281-0350
- Linux内核之XArray
- WCDMA,CDMA2000,TD_SCDMA
- ncurses屏幕操作:getyx(),getparyx(),getmaxyx(),scr_dump(),scr_restore(),getwin(),putwin()
- python之字典的操作
- java stream read_Java ObjectInputStream read()用法及代码示例
- c语言disp是什么意思及用法,disp(disp是什么功能)
- 红外遥控c语言,NEC协议红外遥控器