原 setState 和 compareAndSetState方法作用分析

AQS中有三个protected方法:getState, setState, compareAndSetState。

这三个方法是AQS中提供给自定义同步器来获取state状态的三个基本工具方法,那么setState和compareAndSetState都是用来修改状态的,两者有什么不一样,为什么两者能共存,其各自使用场景分别是什么?

分析AQS和ReentrantLock的源码可知:

compareAndSetState通常用于在获取到锁之前,尝试加锁时,对state进行修改,这种场景下,由于当前线程不是锁持有者,所以对state的修改是线程不安全的,也就是说可能存在多个线程都尝试修改state,所以需要保证对state修改的原子性操作,即使用了unsafe类的本地CAS方法;
setState方法通常用于当前正持有锁的线程对state变量进行修改,不存在竞争,是线程安全的,所以此处没必要用CAS保证原子性,修改的性能更重要。

猜你喜欢

转载自blog.csdn.net/ko0491/article/details/90768892