线程的有序性

75 阅读1分钟

线程的有序性

  • 单线程下未必是先执行第一行再执行第二行。

    • why?

    • 为了效率

      1. cpu比内存的速度快100倍左右,
      2. 指令优化
      3. 上下两条指令没有关系
      4. 不影响单线程的最终一致性, as -if-serial(看上去好像是连续的)
  • synchronized 内部是不能保证有序性

并发的可见性

  • synchronized

    • 当解锁的时候,他会把所有的工作缓存和主存的内容做刷新
  • volatile

并发的原子性

  • 用锁保证原子性

    • 悲观锁和乐观锁

      1. 线程执行时间长,等待线程多使用悲观锁;执行时间短,等待线程少使用乐观锁。
      2. 乐观锁(CAS)
    • synchronized 可以

    lock 命令 有内存屏障,上面一个下面一个

synchronized 锁升级问题

  1. 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)

内存屏障分读屏障、写屏障、全屏障。

内存屏障可以防止指令重排序。

\