JUC

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)