1.用法
用法 xxx.compareAndSet (x,y)
x:预判值 。 y :修改值。
讲 x 的值修改为 y。
方法返回值是 Boolean 类型。
2. 思考
-
该方法是属于 cas 自旋锁的重要工具。 自旋锁就是无锁。因为没有加锁。锁是一种很重量级的东西,例如 sy… 加上之后程序运行速度奇慢无比。而此时出现了代替他的自旋锁。
-
为什么要用 cas 取代 sy…
使用 cas 一般需要 while 循环配合试错。当尝试的结果返回 true 的时候执行一些列的操作。就好比你去上厕所要不停地去检查有没有一间厕所门是开着的。
而 sy… 相反一般配合 notify 使用,你第一次没抢到厕所,会有人上完之后温馨提醒你去有空的厕所。
我们都知道 加锁 sy。。是一种很重量级的操作。时间消耗很高,而不断试错 (自旋锁) 的成本很低。两个成本相比较而言,试错优胜,所有自旋锁胜出。 他们的目标是相同的。都是上厕所。我自旋锁虽然要去看一万遍有没有空的房间,但是成本依然很低,因为现在的 cpu 性能都很高。而加锁很拖慢时间。因为锁里面的操作涉及指令重排序等等。
-
自旋锁的问题。既然我把自旋锁猛夸一边,难道他就没什么问题吗 。当然有。就像有,三个人同时看见一间厕所怎么办?
-
让最先看见的人去上 ,不停看厕所有没有人,但是这样也是很消耗 cpu 的。类似于忙等。
-
让最先看见的人去上厕所,其余人回去睡觉 (wait)。这样也会涉及加锁问题但是锁里面的代码块很少。相比之前。运行更加快了。