class Task1 implements Runnable {
@Override
public void run() {
synchronized (db) {
ContentValues cv1 = new ContentValues();
cv1.put("name", "李");
cv1.put("age", 17);
db.insert("person", null, cv1);
}
}
}
class Task2 implements Runnable {
@Override
public void run() {
synchronized (db){
ContentValues cv1 = new ContentValues();
cv1.put("name", "张");
cv1.put("age", 18);
ContentValues cv2 = new ContentValues();
cv2.put("name", "孙");
cv2.put("age", 25);
for (int i = 0; i < 10; i++) {
db.insert("person", null, cv1);
db.insert("person", null, cv2);
}}
}
}
class Task3 implements Runnable {
@Override
public void run() {
ContentValues cv1 = new ContentValues();
cv1.put("name", "王");
cv1.put("age", 22);
ContentValues cv2 = new ContentValues();
cv2.put("name", "赵");
cv2.put("age", 80);
ContentValues cv3 = new ContentValues();
cv3.put("name", "jesse");
cv3.put("age", 99);
for (int i = 0; i < 10; i++) {
db.insert("person", null, cv1);
db.insert("person", null, cv2);
db.insert("person", null, cv3);
}
}
定义一个静态的 static SQLiteDatabase db; 然后我这样加锁问什么不行呢?求指点
没必要过度枷锁,锁住对db的访问就可以了。
今天没工具运行。下次有机会考下代码来看看、
如果db访问的是同一个互斥锁的话,是可以同步的,我不知道你的运行代码怎么写的。
但是锁在同一个运行线程中是非互斥的,只有两个或以上的线程才会出现锁的竞争。
线程的调用时随机的,所以你同时运行三根线程的话,线程的执行顺序是没有保障的。
如果要互斥,可以使用串行效果的线程池,顺序执行线程。
其他情况,线程是同时运行,交叉执行的。
// 1.线程串行..
ExecutorService pool = Executors.newSingleThreadExecutor();
Thread thread1 = new MyThread();
Thread thread2 = new MyThread();
Thread thread3 = new MyThread();
pool.execute(thread1);
pool.execute(thread2);
pool.execute(thread3);
pool.shutdown();