参考
https://www.cnblogs.com/dolphin0520/p/3920373.html
Java中的非阻塞算法
https://blog.csdn.net/lifuxiangcaohui/article/details/8051687
并发中的概念
并发编程中常遇到的三个问题
原子性问题
原子性操作是指程序执行的最小单位,也就是一个线程执行该操作时不能切换到其他线程。非原子性操作在多线程中可能会造成原子性问题,比如典型的i++:
i++ 是一个语法糖,在编译阶段会编译成: t=i+1; i=t;
试想如果两个线程同时执行到了t=i+1;然后后执行的i=t就会覆盖先执行的i=t
可见性问题
学过计算机原理的都知道,由于CPU的速度跟内存读写速度不匹配,所以在CPU跟内存之间加了一层高速缓存,使得CPU不能直接读写内存,只能读写高速缓存。
JVM的内存模型:
线程只能操作工作内存,在多线程情况下,由于每个工作线程对持有同一个变量的不同备份,导致一个线程改变了该变量的值,而另外一个线程得到的变量还是原来的值。这就是所谓的可见性的问题。
有序性问题
有序性问题是由CPU的指令重排引起的。CPU会对没有依赖关系的指令进行重排,这在单线程状态下是完全没有问题的,而多线程下可能会出现问题。
典型的问题是对象的实例化:
Object o = new Object;
实际上在CPU分为三个指令:
&#