并发名词解释

1、CAS(campare and swap比较与交换)作用:保证在无锁状态下,多个线程对值的更新。
CAS的底层实现lock cmpxchg(汇编指令)
实现原理:CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。

假设主内存中有共享变量count = 1,线程A、线程B都取得一个count副本到各自的工作内存中,进行加1操作。如果线程A先对内存中的count值更新,首先比较用count副本1与主内存中最新的count值进行比较,相等则把主内存中的值更新为2,当线程B更新主内存中的值时,同样用读取的count副本值1与主内存中最新的count值2进行比较,不相等则放弃更新主内存中的值。重新读取count=2到线程B的工作内存,count变量加1得到3,写回主内存时,同样用count=2副本与内存中最新的值进行比较,相等则主内存中count值更新为3。

2、指令重排序:java语言规范规定JVM线程内部维持顺序化语义。即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。指令重排序的意义是什么?JVM能根据处理器特性(CPU多级缓存系统、多核处理器等)适当的对机器指令进行重排序,使机器指令能更符合CPU的执行特性,最大限度的发挥机器性能。

消除锁:是虚拟机另外一种锁的优化,这种优化更彻底,Java虚拟机在JIT编译时(可以简单理解为当某段代码即将第一次被执行时进行编译,又称即时编译),通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过这种方式消除没有必要的锁,可以节省毫无意义的请求锁时间,如下StringBuffer的append是一个同步方法,但是在add方法中的StringBuffer属于一个局部变量,并且不会被其他线程所使用,因此StringBuffer不可能存在共享资源竞争的情景,JVM会自动将其锁消除。
锁消除的依据是逃逸分析的数据支持,前提是java必须运行在server模式(server模式会比client模式作更多的优化),同时必须开启逃逸分析
:-XX:+DoEscapeAnalysis 开启逃逸分析
-XX:+EliminateLocks 表示开启锁消除。

内存屏障

锁重入

AQS

MESI

—转载请注明出处
原文地址:https://www.cnblogs.com/landiss/p/14184482.html