SQLiteOpenHelper
- 管理的是一个数据库,而不是一个表
此数据库可管理多个表,构造函数的版本号也是数据库版本号,不是表版本号哇 - onCreate和onUpgrade何时调用:
注意不是对象构造时,而是调用getReadableDatabase / getWriteableDatabase时,具体参考 getDatabaseLocked,其中包含onCreate和onUpgrade调用
并发概念
- 原子性
原子操作,指操作期间cpu不切换线程上下文 - 可见性
多线程下,每个子线程的有自己的数据缓存,数据改变仅发生在线程缓存空间,其它线程是看不到的,只有经过同步处理,数据才会回写到主存,并更新到其它线程的缓存中
synchronized 和 volatile
-
synchronized
在JVM内部,为了提高效率,同时运行的每个线程都会有它正在处理的数据的缓存副本,当我们使用synchronzied进行同步的时候,真正被同步的是在不同线程中表示被锁定对象的内存块(副本数据会保持和主内存的同步,现在知道为什么要用同步这个词汇了吧),简单的说就是在同步块或同步方法执行完后,对被锁定的对象做的任何修改要在释放锁之前写回到主内存中;在进入同步块得到锁之后,被锁定对象的数据是从主内存中读出来的,持有锁的线程的数据副本一定和主内存中的数据视图是同步的 -
volatile
volatile关键字是一种简单的同步的处理机制,因为被volatile修饰的变量遵循以下规则:- 变量的值在使用之前总会从主内存中再读取出来。
- 对变量值的修改总会在完成之后写回到主内存中。
但只有修改时不依赖当前状态(读取时的值)的变量才应该声明为volatile变量
并发数据结构
- 并发Map
ConcourrentMap 接口在Map接口基础上增加了3个原子操作方法
ConcourrentHashMap 是ConcourrentMap的实现类,内部分为16块分别加锁 - 并发集合类的使用
并发集合类ConcourrentHashMap和CopyOnWriteArrayList,他们在多线程环境下能保证自身状态的一致性,但使用时,依然需要再外加同步锁,因为写操作可能依赖之前的状态
网友评论