インタビューの高周波質問の1つであるCASロックフリーメカニズムの原理実際には、CASロックフリーメカニズムは、日常の開発で直接使用されるのではなく、一連のパッケージツールを通じて使用されます。
たぶん面接官は質問をしないし、そのようなことがあることさえ知りません。
1. CASの理解についてお話しいただけますか?
参照回答:
通常、マルチスレッドの安全性を確保する3つの方法について言及しました。1つはSynchronizeキーワードを使用する方法ですが、Synchronizeを使用してロックした後のマルチスレッドはシリアルと同等であり、実行効率が高すぎないという問題があります。同時実行性の高いシナリオでは、ロックロックの2番目の方法を使用すると、ロックロックのパフォーマンスがSynchronizeキーワードを使用するよりも大幅に向上します。実際、ロックロックの下部はAQS + CASメカニズムによって実現されます。3番目の方法は、 Javaコンカレントパッケージ下のAtomic "e Tao Mi Ke"アトミック操作クラス。アトミッククラスを使用した後は、SynchronizeキーワードやLockを使用してロックする必要はありません。これもスレッドセーフです。アトミッククラスの最下層は、CASロックフリーアルゴリズムに基づいて実装されています。 。
CASは比較後に交換されます。CASには、古い値A、新しい値B、および読み取る必要のあるメモリ値Vの3つのオペランドがあります。変数を更新すると、CASは、A = Vが同じ場合に限り、メモリ値VをBに変更します。それ以外の場合は、何もしません。
参照回答は少し時間がかかり、CASアプリケーションシナリオでのアトミッククラスの使用に言及していますが、
2. CASの実現原理について教えてください。
参考回答
JavaのCASは、Unsafe "Anseifu"クラスのネイティブメソッドを呼び出すことによって実装され、CはCPUの基本的なコマンドを呼び出します。
安全でないと尋ねたら?
Unsafeクラスは、JDKによって提供される比較的低レベルのクラスであり、安全ではないクラスです。公式では開発者に推奨していません。なぜですか?①安全でないものが将来削除される可能性があります。つまり、高バージョンのjdkが実行されなくなる可能性があります。安全でない多くのメソッドは、メモリアドレスと置き換えられるオブジェクトのアドレスを提供する必要があります。問題が発生すると、jvmインスタンスがクラッシュするため、途中で計算の問題が発生します;③Unsafeで提供されるメモリへの直接アクセスの方法は、過失がメモリリークを引き起こす可能性がある場合、jvmによって管理されず、手動操作を必要とします。
一般的に使用される安全でない:「補給は、理解することができます。」
- メモリ管理:メモリの割り当てと解放を含む
- 操作类、对象、变量:通过获取对象和变量偏移量直接修改数据
- 挂起与恢复:将线程阻塞或者恢复阻塞状态
- CAS:调用 CPU 的 CAS 指令进行比较和交换
- 内存屏障:定义内存屏障,避免指令重排序
如果你想了解加深CAS原理,那么可以敲出一个原子类变量,比如AtomicInteger,直接看一下他的源码,找一下Unsafe是怎么大量应用的。
3、能说一下CAS的优缺点?
缺点
- CPU开销比较大:
在并发量比较高的情况下,如果线程反复尝试更新一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。 - 只能保证一个共享变量的原子操作:
只能是一个变量的原子操作,无法确保整个代码块的原子性,也就是在需要保证2个及以上变量共同进行原子性的更新时,就不得不使用Synchronized了 - ABA问题:
假设有一个变量 A ,经修改后变为B,然后又修改为 A,实际已经修改过了,但 CAS 可能无法感知,造成了不合理的值修改操作。
解决方案是:使用版本号,在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A
*优点
在一般情况下,性能优先于锁的使用。
4、最后补充
从思想上来说,Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。
CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。
CAS和Synchronized没有绝对的好与坏,关键看使用场景。在并发量非常高的情况下,反而用同步锁更合适一些。