一.CAS机制
CAS是英文单词Compare And Swap的缩写,也就是比较并替换。在Java中 CAS 底层使用的就是自旋锁 + UnSafe类。
CAS 的含义是“我认为原有的值应该是什么,如果是,则将原有的值更新为新值,否则不做修改,并告诉我原来的值是多少
当一个线程对一个变量进行操作时,会创建三个操作数保存该变量的信息,也就是内存地址V,变量原来的值A,要修改的新值B。当该线程对变量操作完毕要把新值保存到变量之前,会先比较A与内存地址V中当前的实际值是否相等,相等才能将变量的值更新为新值B,否则提交失败,并重新尝试。这个重新尝试的过程被称为自旋。
二.CAS机制的缺点:
①CPU开销较大,不适合用于写操作并发量高的场景。
②只能保证一个变量的原子性操作,无法保证整个代码块或者说多个变
量的原子性。
二.CAS ABA 问题
比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的
可以通过版本号+1 修改后版本加1
三. UnSafe类
Unsafe类都是直接调用操作系统底层资源执行任务
Unsafe可认为是Java中留下的后门,提供了一些低层次操作,如直接内存访问、线程调度等。
四. CAS机制与Synchronized的区别
①CAS机制属于乐观锁,乐观的认为程序中的并发情况不那么严重,所
以让线程不断进行尝试。
②而Synchronized属于悲观锁,悲观的认为程序中的并发情况严重,所
以对于每一个操作都严防死守。它会让没有得到锁资源的线程进入阻塞
态,当在争夺到锁资源后恢复为就绪态,这个过程涉及到操作系统用户
模式和内核模式的状态,代价比较高。