最近在做一个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数据库多线程并发问题相关推荐

  1. java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务

    java项目中如何利用多线程实现一个定时器任务 发布时间:2020-11-10 16:04:03 来源:亿速云 阅读:86 作者:Leah 今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时 ...

  2. python访问数据库如何解决高并发_怎样解决数据库高并发的问题

    怎样解决数据库高并发的问题?解决数据库高并发使用缓存式的Web应用程序架构.增加Redis缓存数据库.增加数据库索引.页面静态化.使用存储过程.MySQL主从读写分离.分表分库.负载均衡集群. 解决数 ...

  3. android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术

    本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术.初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习.下面是个人的总结 拉勾IT课小编为大 ...

  4. java handler使用方法_Android中Handler的使用方法及实例(基础回顾)

    Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中. 本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s ...

  5. java mysql 回滚_Java 中对数据库操作时的 回滚

    Connection conn=null; conn.rollback()就可以回滚 //用jdbc连接数据库 //举例子,比如你在写一个级联删除的方法的时候,为了保证数据完整性,删除的时候一定要确定 ...

  6. java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令

    这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习 android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析 ...

  7. java 登录qq空间_Android中集成QQ登陆和QQ空间分享

    本文基于QQ open sdk V2.4.1. QQ登录应用有一个地方是需要注意的, QQ申请同一品牌应用(包括网站和app),需要相互依赖申请,因为在QQ互联中,一个应用对应一个app key,如果 ...

  8. java%3e%3e=符号_android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值...

    在项目中,有时候在一些控件(如Button.TextView)中要添加一些符号,如下图所示: 这个时候可以使用图片的方式来显示,不过这些可以直接使用Unicode码就直接显示出来了. 4个箭头图标的代 ...

  9. java手机电池充电代码_Android中获取电池电量实例代码

    /** * * @author chrp * *显示当前电池电量 */ public class MainActivity extends Activity { private TextView tv ...

最新文章

  1. 如何为你的博客文章自动添加版权信息?
  2. C#基于Socket的CS模式的完整例子
  3. Java调用WeChat's API总结
  4. 如何解锁excel表格保护_Excel表格技巧—如何计算矩阵相乘
  5. c语言十进制小数转其他进制,只写出了十进制小数转换成二进制的,求二进制小数转十进制的...
  6. jsp入门配置Tomcat
  7. IE浏览器打不开网页有什么解决的方法
  8. InfiniBand -- 无限带宽技术(简称IB) 基于 Ubuntu 16.04 安装 IB 驱动
  9. Python常用模块 之 hashlib模块
  10. React的调和过程(Reconcilliation)
  11. 用命令如何返回上级目录
  12. LTE-5G学习笔记17--COMP技术讲解
  13. 基于rfid的毕业设计题目50例
  14. python wgs84坐标转换_python WGS84和ECEF坐标的转换
  15. Hadoop系统中的单点故障解决方案总结
  16. 转:用迅雷下载Android SDK全系列
  17. CCF论文列表(2022拟定)大更新!NAACL升B!ICLR继续陪跑...MICCAI空降B!PRCV空降C!
  18. ppt在线快速转换成pdf的方法
  19. 条码打印软件如何使用Excel表批量打印条码标签
  20. 安防视频流媒体服务器Easy NVR搭建之DASH直播平台的搭建需要具备哪些条件?

热门文章

  1. Linux系统C语言实现 根据进程号/进程名获取进程的运行时间
  2. Linux内核:一文读懂文件系统、缓冲区高速缓存和块设备、超级块
  3. BeyondCompare3提示许可密钥过期完美解决方法:3281-0350
  4. Linux内核之XArray
  5. WCDMA,CDMA2000,TD_SCDMA
  6. ncurses屏幕操作:getyx(),getparyx(),getmaxyx(),scr_dump(),scr_restore(),getwin(),putwin()
  7. python之字典的操作
  8. java stream read_Java ObjectInputStream read()用法及代码示例
  9. c语言disp是什么意思及用法,disp(disp是什么功能)
  10. 红外遥控c语言,NEC协议红外遥控器