Java中的原子操作是指不可分割的基本操作,如读取、修改等操作,也称为“原子性”。而Atomic类则是JDK提供的一组用于实现原子操作的工具类,如AtomicInteger、AtomicLong、AtomicReference等。
Atomic类的原理是通过硬件级别提供的CAS(Compare And Swap)指令实现的。CAS指令是一种原子操作,它可以比较内存中的值和期望值,如果相等,就把新值写入内存,否则不做任何操作。可以简单地认为CAS指令的作用是在多线程环境下实现内存中的原子操作,即保证操作的原子性。
如AtomicInteger类的incrementAndGet()方法的实现就是使用了CAS指令:
1. 首先,将当前值和期望值进行比较,如果相等,则将新值设置为当前值加1。
2. 如果比较失败,说明当前值已经被其它线程修改了,需要重新尝试。
3. 重复上述两个步骤,直到比较成功并更新了值为止。
值得注意的是,由于CAS指令是通过硬件提供支持的,因此在执行过程中并没有加锁,这就意味着,使用Atomic类实现的原子操作能够保证比较高的性能和并发度,避免了显式锁带来的性能问题。但是在一些特定的场景下,仍然需要使用锁来保证一些复合操作的原子性。