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。
网友评论