不得不说一句,谷歌口气好大,SMP啊…怎么着也是超算领域的名词啊…
- Android上的处理器主要分为两种:uni-processor,流水线级的并行;SMP,内核级的并行
- Android处理器保证,读与读之间不会重排序,写与写之间不会重排序
- 即便是写通的Cache,在真正数据落地前也会运行数条指令
- 对现有的大部分ARM处理器来说,32bytes的数据读写基本上是在一个Cache Line,是原子性的。同时,邻近的Byte、int等小于32bytes的值,读写都是会同时更新邻近的数据,会有额外开销
- 在ARM上,不同位置读写被感知的顺序是不保证的,
A = 41
B = 1 // “A may not be ready” - C中的volatile可能会导致非原子操作
- 对于Synchronized块
A;synchronized(D){B;}C;
,必须不能假设执行顺序是ABC - 近邻的synchronized块可能被编译器合并
- double和long型如果不是volatile的,读写都不是原子的
- Double Checked Locking需要将单实例设为volatile才能work,解释
- 对于synchronized块,逻辑保证是,释放块之前(monitorexit)所有操作都做完了。并不保证,释放块之后的操作在monitorexit之前完成
- 注意的是synchronized仅保证同一对象的synchronized块之间的读写是可见的
- 关于Volatile的好文