JUC

作者: kennethan | 来源:发表于2018-07-23 08:12 被阅读0次

    jvm会为每一个线程都分配一个独立的缓存用于提高效率。

    一个线程对主存数据的修改,要经过:读-改-写。

    多个线程访问共享数据时,彼此不可见。

    同步锁synchronized,每次读取共享变量的时候都会刷新缓存,可以保证可见性。

    但是,同步锁的效率很低。

    volatile关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。底层调用了计算机底层代码,叫做内存屏障,实际上,时刻的把缓存中的数据刷新。我们可以理解为,volatile修饰的变量的操作都是在主存中完成的。底层的内存屏障,保证在线程的缓存中操作了共享变量之后,实时的刷新到主存。

    用了volatile,会让程序的性能降低一点。因为,jvm有重排序,用了volatile,就会禁止重排序。

    相较于synchronized是一种较为轻量级的同步策略。

    1.volatile不具有互斥性。

    2.不能保证变量的原子性。

    1.volatile保证内存可见性

    2.CAS(compare-and-Swap)算法保证数据的原子性

        CAS算法是硬件对于并发操作共享数据的支持

        CAS包含了三个操作数:

        内存值V

        预估值(旧值)A

        更新值B

        当且仅当V==A时,V=B。否则,将不做任何操作

    ====================

    此包还提供了设计用于多线程上下文中的 Collection 实现:ConcurrentHashMap、 ConcurrentSkipListMap、 ConcurrentSkipListSet、

    CopyOnWriteArrayList 和 CopyOnWriteArraySet。当期望许多线程访问一个给定 collection 时, ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。当期望的读数和遍历远远大于列表的更新数时, CopyOnWriteArrayList 优于同步的 ArrayList。

    相关文章

      网友评论

          本文标题:JUC

          本文链接:https://www.haomeiwen.com/subject/cskdmftx.html