compareAndSet的理解(萌新易懂版)

这篇文章不是探讨他的用法和语法(虽然虽然都有),主要是探讨他的设计思想,毕竟再多的工具不懂得设计思想也不知道怎么用。

一,用法

用法xxx.compareAndSet(x,y)

x:预判值 。 y :修改值。

讲x 的值修改为y。

方法返回值是Boolean类型。

二,思考

1.该方法是属于cas自旋锁的重要工具。 自旋锁就是无锁。因为没有加锁。锁是一种很重量级的东西,例如sy.....加上之后程序运行速度奇慢无比。而此时出现了代替他的自旋锁。

2.为什么要用cas取代sy....

使用cas一般需要while循环配合试错。当尝试的结果返回true的时候执行一些列的操作。就好比你去上厕所要不停地去检查有没有一间厕所门是开着的。

而sy....相反一般配合notify使用,你第一次没抢到厕所,会有人上完之后温馨提醒你去有空的厕所。

我们都知道 加锁sy。。是一种很重量级的操作。时间消耗很高,而不断试错(自旋锁)的成本很低。两个成本相比较而言,试错优胜,所有自旋锁胜出。 他们的目标是相同的。都是上厕所。我自旋锁虽然要去看一万遍有没有空的房间,但是成本依然很低,因为现在的cpu性能都很高。而加锁很拖慢时间。因为锁里面的操作涉及指令重排序等等。

3.自旋锁的问题。既然我把自旋锁猛夸一边,难道他就没什么问题吗 。当然有。就像有,三个人同时看见一间厕所怎么办?

1.让最先看见的人去上 ,不停看厕所有没有人,但是这样也是很消耗cpu的。类似于忙等。

2.让最先看见的人去上厕所,其余人回去睡觉(wait)。这样也会涉及加锁问题但是锁里面的代码块很少。相比之前。运行更加快了。

结论:不要害怕尝试,一万次失败相对于一次成功而言,代价是很轻的。

你可能感兴趣的:(java,多线程,java,spring)