线程的有序性
-
单线程下未必是先执行第一行再执行第二行。
-
why?
-
为了效率
- cpu比内存的速度快100倍左右,
- 指令优化
- 上下两条指令没有关系
- 不影响单线程的最终一致性, as -if-serial(看上去好像是连续的)
-
-
synchronized 内部是不能保证有序性
并发的可见性
-
synchronized
- 当解锁的时候,他会把所有的工作缓存和主存的内容做刷新
-
volatile
并发的原子性
-
用锁保证原子性
-
悲观锁和乐观锁
- 线程执行时间长,等待线程多使用悲观锁;执行时间短,等待线程少使用乐观锁。
- 乐观锁(CAS)
-
synchronized 可以
lock 命令 有内存屏障,上面一个下面一个
-
synchronized 锁升级问题
-
CAS (compare and swap / compare and exchange)
-
先比较再写值(必须是原子的)
-
ABA 问题
-
解决?加个版本号。
- 任何一次改变版本号都加1
-
-
ActomicInteger (CAS 的实现)
-
Hotspot 实现的 native 的 compareAndSwapInt 方法
-
进入 LOCK_IF_MP(multy processor)
- 底层实现是 lock cmpxchg(cmpxchg 不是原子的,所以需要 lock)
- 当处理器的时候需要加 lock
-
lock 指令锁定的是北桥信号,不采用锁总线的方式
-
-
缓存一致性机制?
缓存一致性机制就整体来说,是当某块CPU对缓存中的数据进行操作了之后,就通知其他CPU放弃储存在它们内部的缓存,或者从主内存中重新读取。
内存屏障(Memory Barrier),也称内存栅栏(Memory Fence)
内存屏障分读屏障、写屏障、全屏障。
内存屏障可以防止指令重排序。
\