博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中Sqlite数据库多线程并发问题
阅读量:4331 次
发布时间:2019-06-06

本文共 2649 字,大约阅读时间需要 8 分钟。

最近在做一个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()是为了测试自旋锁

参考:

()

转载于:https://www.cnblogs.com/yushiro/archive/2011/07/14/2105830.html

你可能感兴趣的文章
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
机器学习降维之主成分分析
查看>>
CTP2交易所成交回报
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>