synchronize可以保证原子操作,但是频繁加锁失败阻塞的开销问题确实难顶,因而Java中还提供了一个非阻塞的原子操作CAS。CAS(compare and swap/set) 通过硬件保证了比较-更新操作的原子性,底层对应指令 lock cmpxchg,在单核和多核CPU下都可以保证原子性。CAS必须配合volatile来使用,主要就是利用了它可以保证可见性的特性。
    CAS比synchronized快吗?synchronized属于悲观锁,认为线程总是会修改共享数据的值,因此用锁保障,当竞争锁失败的进程进入阻塞(引起一次状态的切换),这涉及到OS层面的操作,会有一定的开销;CAS属于乐观锁,如果比较值不通过就一直循环比较,直到赋值(交换值)成功,因此会一定程度上消耗CPU的资源。总结,CAS适合用于多核的环境下,线程数小于核心数的情况会较优,在这种情况下确实会比synchronized优。