其实网上有很多做过实验对比的,这里就不一一叙述了,
总的来说就是,竞争少的情况下CAS优于synchronized,反之synchronized优于CAS。
刚开始接触CAS的时候,一听说是锁,还是非阻塞的,就觉得肯定比加锁快,其实不然,还是得透过现象看本质,不要管中窥豹。
我尝试用几句话总结:
- CAS:一般是系统底层的一套指令,作用就是同一时刻做这套指令的时候,其他相同的指令的线程不会干扰,保持原子性,常用于自旋锁。
- synchronized:加锁,同步代码块或者函数,当一个线程拿到锁后,其他线程等待,直到拿到锁的时候释放锁。
根据上述,我们可以知道,CAS失败的情况下,自旋锁会一直旋转,synchronized虽然不会旋转,但是在获得锁的情况下,除了异常,其他情况下是肯定成功的。
所以两者的时间差别就是,自旋的时间和线程上下文切换的时间,虽然在其他资源在充足情况下,自旋成功下的时间肯定比线程加锁要来的快,但是你考虑下,如果竞争很激烈的情况下,是不是只有一个CAS能成功,那么其他的都是失败自旋,那么在这种情况下,CPU的资源的消耗可以说十分大的,那我还不如给这个共享资源加锁,剩下的线程等待不占用CPU资源,这种情况下,你可以考虑负载均衡,你可以考虑在别的情况下并行或者并发处理别的事务,都可以,否则如果遇到stop world 的情况就得不偿失了。
希望大家指点和交流,谢谢!