###等待/通知模式分为2种
1、Java基类中的wait,notify,notifyAll
2、Condition接口的await(),signal();
3、LockSupport工具类park(),unpark()
###区别
1、Java基类中的wait,notify,notifyAll
使用Synchronized 实现的,悲观锁(也叫重量级锁)。性能差,并发基本上不用
2、无锁编程,Java 并发包(JUC)
Codition是要配合ReentactLock使用的。实现原理是CAS原理。
Condition维护了一个队列,该队列叫等待队列(是将await的线程放入等待队列中,这个队列和AQS竞争锁的阻塞队列(CLH)不一样)
只有被唤醒的线程,才会进入CLH队列里。
Condition的await方法就是用LockSupport.Park()方法实现的。
Condition的signal方法就是用LockSuport.unpark()方法实现的
Unsafe类中调用JNI(Java native interfce Java本地调用),使CPU自旋。
LockSupport 也是同样的使用Unsafe 类来实现的。
###CAS原理
compare and swap 比较并替换
线程A 和线程B 同时想要获取主内存中的int i=0;
A: i++ 使i=1
B:认为A会执行成功,所以以为A是1,B也执行i++;B想要的结果是2;
CAS 也是使用Unsafe类中的compareAndSwapInt
B线程会进行CAS
B线程会获取 主内存中的数据E,期待是A已经将数据改为1(B),如果E 期待值B,则执行1++,设置数据为2(V)
如果E0,则继续循环,直到E==1.