1.什么是CAS机制?
他的全称是compare and swap,比较并且交换,所以他是相当于通过一个原子操作,经过读取内存,比较数据,交换数据这个三个步骤,本质上是CPU指令的支撑
2.你了解在jdk中那些地方使用到了CAS机制?
1.ConcurrentHashMap
2.Java原子类
3.自旋锁的实现
3.CAS有什么问题和缺陷?
1.ABA问题
2.只能保证单个变量的原子性,不能保证代码块的原子性
3.CAS会导致CPU利用率增加
4.什么是ABA问题?
CAS机制不是读取内存比较数据,交换数据吗,如果假如说这个数据是A,然后他变为了B,然后又变为了A,CAS他是检查不到的,但是他其实是变化了的,在某些场景可能问题不是很大,但是在有的场景中却容易出现问题。
5.怎么解决ABA问题?
给要比较的数据引入版本号,等到CAS机制进行比较的时候,就会比较版本号是否符合预期,如果当前数据的版本号和旧数据的版本号一样的话,就能比较交换,并且让版本号自增,而不一样的话就会失败。
JDK的Atomic包里提供了一个类AtomicStampedReference来解决ABA问题。
6.CountDownLatch,CyclicBarrier,Semaphore,Exchanger了解吗?
CountDownLatch,这个就是一个倒计时器,等一个或多个线程等待其他线程完成。
CyclicBarrier,他的字面意思是可循环使用的障壁,就当一组线程到达这个障壁时,就会让起发生堵塞,然后等到最后一个线程到达障壁时,这个障壁才会解放这些线程
Semaphore,他就是用来控制访问特定资源的线程数,来确保资源的分配合理性。
Exchanger,是一个线程之间协程的工具类,然后他是用来线程之间进行数据交换的,他提供一个同步点,在这个同步点时,可以进行数据交换。